Add threshold to dragging nodes with select to prevent accidental drags

This commit is contained in:
fox 2021-06-04 11:39:46 -04:00
parent 766c6dbb24
commit 00a4ee5cf3
4 changed files with 36 additions and 15 deletions

View File

@ -2556,20 +2556,8 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
// Start dragging // Start dragging
if (still_selected) { if (still_selected) {
// Drag the node(s) if requested // Drag the node(s) if requested
List<CanvasItem *> selection2 = _get_edited_canvas_items(); drag_start_origin = click;
drag_type = DRAG_QUEUED;
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);
}
} }
// Select the item // Select the item
return true; return true;
@ -2577,6 +2565,34 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &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());
bool movement_threshold_passed = drag_start_origin.distance_to(click) > 10 * EDSCALE;
if (m.is_valid() && movement_threshold_passed) {
List<CanvasItem *> 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 (drag_type == DRAG_BOX_SELECTION) {
if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT) { if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT) {
// Confirms box selection // Confirms box selection

View File

@ -209,6 +209,7 @@ private:
DRAG_ANCHOR_BOTTOM_RIGHT, DRAG_ANCHOR_BOTTOM_RIGHT,
DRAG_ANCHOR_BOTTOM_LEFT, DRAG_ANCHOR_BOTTOM_LEFT,
DRAG_ANCHOR_ALL, DRAG_ANCHOR_ALL,
DRAG_QUEUED,
DRAG_MOVE, DRAG_MOVE,
DRAG_MOVE_X, DRAG_MOVE_X,
DRAG_MOVE_Y, DRAG_MOVE_Y,
@ -384,6 +385,7 @@ private:
Control *top_ruler; Control *top_ruler;
Control *left_ruler; Control *left_ruler;
Point2 drag_start_origin;
DragType drag_type; DragType drag_type;
Point2 drag_from; Point2 drag_from;
Point2 drag_to; Point2 drag_to;

View File

@ -1244,6 +1244,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
} }
_edit.mouse_pos = b->get_position(); _edit.mouse_pos = b->get_position();
_edit.original_mouse_pos = b->get_position();
_edit.snap = spatial_editor->is_snap_enabled(); _edit.snap = spatial_editor->is_snap_enabled();
_edit.mode = TRANSFORM_NONE; _edit.mode = TRANSFORM_NONE;
@ -1450,7 +1451,8 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
} else if (nav_scheme == NAVIGATION_MODO && m->is_alt_pressed()) { } else if (nav_scheme == NAVIGATION_MODO && m->is_alt_pressed()) {
nav_mode = NAVIGATION_ORBIT; nav_mode = NAVIGATION_ORBIT;
} else { } else {
if (clicked.is_valid()) { bool movement_threshold_passed = _edit.original_mouse_pos.distance_to(_edit.mouse_pos) > 10 * EDSCALE;
if (clicked.is_valid() && movement_threshold_passed) {
if (!clicked_includes_current) { if (!clicked_includes_current) {
_select_clicked(clicked_wants_append, true); _select_clicked(clicked_wants_append, true);
// Processing was deferred. // Processing was deferred.

View File

@ -387,6 +387,7 @@ private:
Vector3 orig_gizmo_pos; Vector3 orig_gizmo_pos;
int edited_gizmo = 0; int edited_gizmo = 0;
Point2 mouse_pos; Point2 mouse_pos;
Point2 original_mouse_pos;
bool snap = false; bool snap = false;
Ref<EditorNode3DGizmo> gizmo; Ref<EditorNode3DGizmo> gizmo;
int gizmo_handle = 0; int gizmo_handle = 0;