Prevent accidental drags by adding drag distance threshold
Co-authored-by: fox <12120644+foxydevloper@users.noreply.github.com>
This commit is contained in:
parent
08d517243c
commit
44b01751e6
4 changed files with 37 additions and 15 deletions
|
@ -2491,20 +2491,8 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
|
|||
// Start dragging
|
||||
if (still_selected) {
|
||||
// Drag the node(s) if requested
|
||||
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);
|
||||
}
|
||||
drag_start_origin = click;
|
||||
drag_type = DRAG_QUEUED;
|
||||
}
|
||||
// Select the item
|
||||
return true;
|
||||
|
@ -2512,6 +2500,35 @@ 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());
|
||||
// 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<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 (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT) {
|
||||
// Confirms box selection
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1206,6 +1206,7 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &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<InputEvent> &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.
|
||||
|
|
|
@ -357,6 +357,7 @@ private:
|
|||
Vector3 orig_gizmo_pos;
|
||||
int edited_gizmo;
|
||||
Point2 mouse_pos;
|
||||
Point2 original_mouse_pos;
|
||||
bool snap;
|
||||
Ref<EditorSpatialGizmo> gizmo;
|
||||
int gizmo_handle;
|
||||
|
|
Loading…
Reference in a new issue