|
@@ -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());
|
|
|
|