Merge pull request #68418 from Sauermann/fix-escape-dnd
Allow canceling Drag and Drop with the Escape-Key
This commit is contained in:
commit
5c7af7f391
2 changed files with 34 additions and 35 deletions
|
@ -1561,44 +1561,15 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
|
|||
set_input_as_handled();
|
||||
}
|
||||
|
||||
if (gui.drag_data.get_type() != Variant::NIL && mb->get_button_index() == MouseButton::LEFT) {
|
||||
if (gui.dragging && mb->get_button_index() == MouseButton::LEFT) {
|
||||
// Alternate drop use (when using force_drag(), as proposed by #5342).
|
||||
gui.drag_successful = false;
|
||||
if (gui.mouse_focus) {
|
||||
gui.drag_successful = _gui_drop(gui.mouse_focus, pos, false);
|
||||
}
|
||||
|
||||
gui.drag_data = Variant();
|
||||
gui.dragging = false;
|
||||
|
||||
Control *drag_preview = _gui_get_drag_preview();
|
||||
if (drag_preview) {
|
||||
memdelete(drag_preview);
|
||||
gui.drag_preview_id = ObjectID();
|
||||
}
|
||||
_propagate_viewport_notification(this, NOTIFICATION_DRAG_END);
|
||||
get_base_window()->update_mouse_cursor_shape();
|
||||
_perform_drop(gui.mouse_focus, pos);
|
||||
}
|
||||
|
||||
_gui_cancel_tooltip();
|
||||
} else {
|
||||
if (gui.drag_data.get_type() != Variant::NIL && mb->get_button_index() == MouseButton::LEFT) {
|
||||
gui.drag_successful = false;
|
||||
if (gui.drag_mouse_over) {
|
||||
gui.drag_successful = _gui_drop(gui.drag_mouse_over, gui.drag_mouse_over_pos, false);
|
||||
}
|
||||
|
||||
Control *drag_preview = _gui_get_drag_preview();
|
||||
if (drag_preview) {
|
||||
memdelete(drag_preview);
|
||||
gui.drag_preview_id = ObjectID();
|
||||
}
|
||||
|
||||
gui.drag_data = Variant();
|
||||
gui.dragging = false;
|
||||
gui.drag_mouse_over = nullptr;
|
||||
_propagate_viewport_notification(this, NOTIFICATION_DRAG_END);
|
||||
get_base_window()->update_mouse_cursor_shape();
|
||||
if (gui.dragging && mb->get_button_index() == MouseButton::LEFT) {
|
||||
_perform_drop(gui.drag_mouse_over, gui.drag_mouse_over_pos);
|
||||
}
|
||||
|
||||
gui.mouse_focus_mask &= ~mouse_button_to_mask(mb->get_button_index()); // Remove from mask.
|
||||
|
@ -1682,7 +1653,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
|
|||
}
|
||||
|
||||
gui.drag_attempted = true;
|
||||
if (gui.drag_data.get_type() != Variant::NIL) {
|
||||
if (gui.dragging) {
|
||||
_propagate_viewport_notification(this, NOTIFICATION_DRAG_BEGIN);
|
||||
}
|
||||
}
|
||||
|
@ -1795,7 +1766,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
|
|||
}
|
||||
}
|
||||
|
||||
if (gui.drag_data.get_type() != Variant::NIL) {
|
||||
if (gui.dragging) {
|
||||
// Handle drag & drop.
|
||||
|
||||
Control *drag_preview = _gui_get_drag_preview();
|
||||
|
@ -1997,6 +1968,12 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
|
|||
}
|
||||
|
||||
if (mm.is_null() && mb.is_null() && p_event->is_action_type()) {
|
||||
if (gui.dragging && p_event->is_action_pressed("ui_cancel") && Input::get_singleton()->is_action_just_pressed("ui_cancel")) {
|
||||
_perform_drop();
|
||||
set_input_as_handled();
|
||||
return;
|
||||
}
|
||||
|
||||
if (gui.key_focus && !gui.key_focus->is_visible_in_tree()) {
|
||||
gui.key_focus->release_focus();
|
||||
}
|
||||
|
@ -2078,6 +2055,27 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
|
|||
}
|
||||
}
|
||||
|
||||
void Viewport::_perform_drop(Control *p_control, Point2 p_pos) {
|
||||
// Without any arguments, simply cancel Drag and Drop.
|
||||
if (p_control) {
|
||||
gui.drag_successful = _gui_drop(p_control, p_pos, false);
|
||||
} else {
|
||||
gui.drag_successful = false;
|
||||
}
|
||||
|
||||
Control *drag_preview = _gui_get_drag_preview();
|
||||
if (drag_preview) {
|
||||
memdelete(drag_preview);
|
||||
gui.drag_preview_id = ObjectID();
|
||||
}
|
||||
|
||||
gui.drag_data = Variant();
|
||||
gui.dragging = false;
|
||||
gui.drag_mouse_over = nullptr;
|
||||
_propagate_viewport_notification(this, NOTIFICATION_DRAG_END);
|
||||
get_base_window()->update_mouse_cursor_shape();
|
||||
}
|
||||
|
||||
void Viewport::_gui_cleanup_internal_state(Ref<InputEvent> p_event) {
|
||||
ERR_FAIL_COND(p_event.is_null());
|
||||
|
||||
|
|
|
@ -405,6 +405,7 @@ private:
|
|||
Control *_gui_find_control_at_pos(CanvasItem *p_node, const Point2 &p_global, const Transform2D &p_xform, Transform2D &r_inv_xform);
|
||||
|
||||
void _gui_input_event(Ref<InputEvent> p_event);
|
||||
void _perform_drop(Control *p_control = nullptr, Point2 p_pos = Point2());
|
||||
void _gui_cleanup_internal_state(Ref<InputEvent> p_event);
|
||||
|
||||
_FORCE_INLINE_ Transform2D _get_input_pre_xform() const;
|
||||
|
|
Loading…
Reference in a new issue