From 44b01751e6300736a58d0f0aaf34a7b95557580f Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 16 Jul 2021 06:03:09 +0200 Subject: [PATCH] Prevent accidental drags by adding drag distance threshold Co-authored-by: fox <12120644+foxydevloper@users.noreply.github.com> --- editor/plugins/canvas_item_editor_plugin.cpp | 45 ++++++++++++++------ editor/plugins/canvas_item_editor_plugin.h | 2 + editor/plugins/spatial_editor_plugin.cpp | 4 +- editor/plugins/spatial_editor_plugin.h | 1 + 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index a74812fcf1e..b6bea0a7e06 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -2491,20 +2491,8 @@ bool CanvasItemEditor::_gui_input_select(const Ref &p_event) { // Start dragging if (still_selected) { // Drag the node(s) if requested - List selection2 = _get_edited_canvas_items(); - - drag_selection.clear(); - for (int i = 0; i < selection2.size(); i++) { - if (_is_node_movable(selection2[i], true)) { - drag_selection.push_back(selection2[i]); - } - } - - if (selection2.size() > 0) { - drag_type = DRAG_MOVE; - drag_from = click; - _save_canvas_item_state(drag_selection); - } + drag_start_origin = click; + drag_type = DRAG_QUEUED; } // Select the item return true; @@ -2512,6 +2500,35 @@ bool CanvasItemEditor::_gui_input_select(const Ref &p_event) { } } + if (drag_type == DRAG_QUEUED) { + if (b.is_valid() && !b->is_pressed()) { + drag_type = DRAG_NONE; + return true; + } + if (m.is_valid()) { + Point2 click = transform.affine_inverse().xform(m->get_position()); + // Scale movement threshold with zoom (which itself is set relative to the editor scale). + bool movement_threshold_passed = drag_start_origin.distance_to(click) > (8 * MAX(1, EDSCALE)) / zoom; + if (m.is_valid() && movement_threshold_passed) { + List selection2 = _get_edited_canvas_items(); + + drag_selection.clear(); + for (int i = 0; i < selection2.size(); i++) { + if (_is_node_movable(selection2[i], true)) { + drag_selection.push_back(selection2[i]); + } + } + + if (selection2.size() > 0) { + drag_type = DRAG_MOVE; + drag_from = click; + _save_canvas_item_state(drag_selection); + } + return true; + } + } + } + if (drag_type == DRAG_BOX_SELECTION) { if (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT) { // Confirms box selection diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 380a1c1a603..dec90a8fa38 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -211,6 +211,7 @@ private: DRAG_ANCHOR_BOTTOM_RIGHT, DRAG_ANCHOR_BOTTOM_LEFT, DRAG_ANCHOR_ALL, + DRAG_QUEUED, DRAG_MOVE, DRAG_SCALE_X, DRAG_SCALE_Y, @@ -390,6 +391,7 @@ private: Control *top_ruler; Control *left_ruler; + Point2 drag_start_origin; DragType drag_type; Point2 drag_from; Point2 drag_to; diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index aec3310758c..abee01551b3 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -1206,6 +1206,7 @@ void SpatialEditorViewport::_sinput(const Ref &p_event) { } _edit.mouse_pos = b->get_position(); + _edit.original_mouse_pos = b->get_position(); _edit.snap = spatial_editor->is_snap_enabled(); _edit.mode = TRANSFORM_NONE; @@ -1412,7 +1413,8 @@ void SpatialEditorViewport::_sinput(const Ref &p_event) { } else if (nav_scheme == NAVIGATION_MODO && m->get_alt()) { nav_mode = NAVIGATION_ORBIT; } else { - if (clicked) { + const bool movement_threshold_passed = _edit.original_mouse_pos.distance_to(_edit.mouse_pos) > 8 * EDSCALE; + if (clicked && movement_threshold_passed) { if (!clicked_includes_current) { _select_clicked(clicked_wants_append, true); // Processing was deferred. diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 8d680cb0105..b9fc25d8632 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -357,6 +357,7 @@ private: Vector3 orig_gizmo_pos; int edited_gizmo; Point2 mouse_pos; + Point2 original_mouse_pos; bool snap; Ref gizmo; int gizmo_handle;