Add threshold to dragging nodes with select to prevent accidental drags
This commit is contained in:
parent
766c6dbb24
commit
00a4ee5cf3
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user