1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-09 12:50:35 +00:00

Prevent accidental drags by adding drag distance threshold

Co-authored-by: fox <12120644+foxydevloper@users.noreply.github.com>
This commit is contained in:
Hugo Locurcio
2021-07-16 06:03:09 +02:00
parent 08d517243c
commit 44b01751e6
4 changed files with 37 additions and 15 deletions

View File

@@ -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