aboutsummaryrefslogtreecommitdiff
path: root/editor/plugins/canvas_item_editor_plugin.cpp
diff options
context:
space:
mode:
authorGilles Roudiere2017-07-30 15:32:22 +0200
committerGilles Roudiere2017-08-13 21:20:13 +0200
commitb329cb9c71ff43d013bd29574db251ddebf9f245 (patch)
treed5155c3a1be7b1104d4c2a7eaa8b94e8990d6a9e /editor/plugins/canvas_item_editor_plugin.cpp
parentfcff42dcb717478d963ce6ad197c5ed7bdfb080c (diff)
downloadgodot-b329cb9c71ff43d013bd29574db251ddebf9f245.tar.gz
godot-b329cb9c71ff43d013bd29574db251ddebf9f245.tar.zst
godot-b329cb9c71ff43d013bd29574db251ddebf9f245.zip
Snap anchors when dragged, depending on the zoom level
Diffstat (limited to 'editor/plugins/canvas_item_editor_plugin.cpp')
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index cbb983172..1fd343c4b 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -775,6 +775,24 @@ CanvasItemEditor::DragType CanvasItemEditor::_get_resize_handle_drag_type(const
return DRAG_NONE;
}
+Vector2 CanvasItemEditor::_anchor_snap(Vector2 anchor) {
+ float radius = 0.05 / zoom;
+ if (fabs(anchor.x - ANCHOR_BEGIN) < radius) {
+ anchor.x = ANCHOR_BEGIN;
+ } else if (fabs(anchor.x - ANCHOR_CENTER) < radius) {
+ anchor.x = ANCHOR_CENTER;
+ } else if (fabs(anchor.x - ANCHOR_END) < radius) {
+ anchor.x = ANCHOR_END;
+ }
+ if (fabs(anchor.y - ANCHOR_BEGIN) < radius) {
+ anchor.y = ANCHOR_BEGIN;
+ } else if (fabs(anchor.y - ANCHOR_CENTER) < radius) {
+ anchor.y = ANCHOR_CENTER;
+ } else if (fabs(anchor.y - ANCHOR_END) < radius) {
+ anchor.y = ANCHOR_END;
+ }
+ return anchor;
+}
Vector2 CanvasItemEditor::_anchor_to_position(Control *p_control, Vector2 anchor) {
ERR_FAIL_COND_V(!p_control, Vector2());
@@ -1319,6 +1337,7 @@ void CanvasItemEditor::_viewport_gui_input(const Ref<InputEvent> &p_event) {
if (b) {
bool ik_found = false;
+
bool first = true;
while (b) {
@@ -1563,10 +1582,11 @@ void CanvasItemEditor::_viewport_gui_input(const Ref<InputEvent> &p_event) {
Control *control = canvas_item->cast_to<Control>();
if (control) {
+ // Drag and snap the anchor
Vector2 anchor = _position_to_anchor(control, canvas_item->get_global_transform_with_canvas().affine_inverse().xform(dto - drag_from + drag_point_from));
+ anchor = _anchor_snap(anchor);
switch (drag) {
- // Handles anchor dragging
case DRAG_ANCHOR_TOP_LEFT:
control->set_anchor(MARGIN_LEFT, anchor.x);
control->set_anchor(MARGIN_TOP, anchor.y);