Enable snapping in 2D when control key pressed
This commit is contained in:
parent
4a5723f59e
commit
9a6b4a3f11
1 changed files with 11 additions and 9 deletions
|
@ -210,6 +210,7 @@ void CanvasItemEditor::_snap_other_nodes(Point2 p_value, Point2 &r_current_snap,
|
||||||
|
|
||||||
Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const CanvasItem *p_canvas_item, unsigned int p_forced_modes) {
|
Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const CanvasItem *p_canvas_item, unsigned int p_forced_modes) {
|
||||||
bool snapped[2] = { false, false };
|
bool snapped[2] = { false, false };
|
||||||
|
bool is_snap_active = snap_active ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL);
|
||||||
|
|
||||||
// Smart snap using the canvas position
|
// Smart snap using the canvas position
|
||||||
Vector2 output = p_target;
|
Vector2 output = p_target;
|
||||||
|
@ -219,7 +220,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
|
||||||
rotation = p_canvas_item->get_global_transform_with_canvas().get_rotation();
|
rotation = p_canvas_item->get_global_transform_with_canvas().get_rotation();
|
||||||
|
|
||||||
// Parent sides and center
|
// Parent sides and center
|
||||||
if ((snap_active && snap_node_parent && (p_modes & SNAP_NODE_PARENT)) || (p_forced_modes & SNAP_NODE_PARENT)) {
|
if ((is_snap_active && snap_node_parent && (p_modes & SNAP_NODE_PARENT)) || (p_forced_modes & SNAP_NODE_PARENT)) {
|
||||||
Point2 begin;
|
Point2 begin;
|
||||||
Point2 end;
|
Point2 end;
|
||||||
bool can_snap = false;
|
bool can_snap = false;
|
||||||
|
@ -241,7 +242,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
|
||||||
}
|
}
|
||||||
|
|
||||||
// Self anchors
|
// Self anchors
|
||||||
if ((snap_active && snap_node_anchors && (p_modes & SNAP_NODE_ANCHORS)) || (p_forced_modes & SNAP_NODE_ANCHORS)) {
|
if ((is_snap_active && snap_node_anchors && (p_modes & SNAP_NODE_ANCHORS)) || (p_forced_modes & SNAP_NODE_ANCHORS)) {
|
||||||
if (const Control *c = Object::cast_to<Control>(p_canvas_item)) {
|
if (const Control *c = Object::cast_to<Control>(p_canvas_item)) {
|
||||||
Point2 begin = p_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(c->get_anchor(MARGIN_LEFT), c->get_anchor(MARGIN_TOP))));
|
Point2 begin = p_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(c->get_anchor(MARGIN_LEFT), c->get_anchor(MARGIN_TOP))));
|
||||||
Point2 end = p_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(c->get_anchor(MARGIN_RIGHT), c->get_anchor(MARGIN_BOTTOM))));
|
Point2 end = p_canvas_item->get_global_transform_with_canvas().xform(_anchor_to_position(c, Point2(c->get_anchor(MARGIN_RIGHT), c->get_anchor(MARGIN_BOTTOM))));
|
||||||
|
@ -251,7 +252,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
|
||||||
}
|
}
|
||||||
|
|
||||||
// Self sides
|
// Self sides
|
||||||
if ((snap_active && snap_node_sides && (p_modes & SNAP_NODE_SIDES)) || (p_forced_modes & SNAP_NODE_SIDES)) {
|
if ((is_snap_active && snap_node_sides && (p_modes & SNAP_NODE_SIDES)) || (p_forced_modes & SNAP_NODE_SIDES)) {
|
||||||
Point2 begin = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position());
|
Point2 begin = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position());
|
||||||
Point2 end = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position() + p_canvas_item->_edit_get_rect().get_size());
|
Point2 end = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position() + p_canvas_item->_edit_get_rect().get_size());
|
||||||
_snap_if_closer_point(p_target, begin, output, snapped, rotation);
|
_snap_if_closer_point(p_target, begin, output, snapped, rotation);
|
||||||
|
@ -259,18 +260,18 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
|
||||||
}
|
}
|
||||||
|
|
||||||
// Self center
|
// Self center
|
||||||
if ((snap_active && snap_node_center && (p_modes & SNAP_NODE_CENTER)) || (p_forced_modes & SNAP_NODE_CENTER)) {
|
if ((is_snap_active && snap_node_center && (p_modes & SNAP_NODE_CENTER)) || (p_forced_modes & SNAP_NODE_CENTER)) {
|
||||||
Point2 center = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position() + p_canvas_item->_edit_get_rect().get_size() / 2.0);
|
Point2 center = p_canvas_item->get_global_transform_with_canvas().xform(p_canvas_item->_edit_get_rect().get_position() + p_canvas_item->_edit_get_rect().get_size() / 2.0);
|
||||||
_snap_if_closer_point(p_target, center, output, snapped, rotation);
|
_snap_if_closer_point(p_target, center, output, snapped, rotation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Other nodes sides
|
// Other nodes sides
|
||||||
if ((snap_active && snap_other_nodes && (p_modes & SNAP_OTHER_NODES)) || (p_forced_modes & SNAP_OTHER_NODES)) {
|
if ((is_snap_active && snap_other_nodes && (p_modes & SNAP_OTHER_NODES)) || (p_forced_modes & SNAP_OTHER_NODES)) {
|
||||||
_snap_other_nodes(p_target, output, snapped, get_tree()->get_edited_scene_root(), p_canvas_item);
|
_snap_other_nodes(p_target, output, snapped, get_tree()->get_edited_scene_root(), p_canvas_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((snap_active && snap_guides && (p_modes & SNAP_GUIDES)) || (p_forced_modes & SNAP_GUIDES)) && fmod(rotation, (real_t)360.0) == 0.0) {
|
if (((is_snap_active && snap_guides && (p_modes & SNAP_GUIDES)) || (p_forced_modes & SNAP_GUIDES)) && fmod(rotation, (real_t)360.0) == 0.0) {
|
||||||
// Guides
|
// Guides
|
||||||
if (EditorNode::get_singleton()->get_edited_scene() && EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_vertical_guides_")) {
|
if (EditorNode::get_singleton()->get_edited_scene() && EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_vertical_guides_")) {
|
||||||
Array vguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_vertical_guides_");
|
Array vguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_vertical_guides_");
|
||||||
|
@ -287,7 +288,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((snap_active && snap_grid && (p_modes & SNAP_GRID)) || (p_forced_modes & SNAP_GRID)) && fmod(rotation, (real_t)360.0) == 0.0) {
|
if (((is_snap_active && snap_grid && (p_modes & SNAP_GRID)) || (p_forced_modes & SNAP_GRID)) && fmod(rotation, (real_t)360.0) == 0.0) {
|
||||||
// Grid
|
// Grid
|
||||||
Point2 offset = grid_offset;
|
Point2 offset = grid_offset;
|
||||||
if (snap_relative) {
|
if (snap_relative) {
|
||||||
|
@ -313,7 +314,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, const
|
||||||
}
|
}
|
||||||
|
|
||||||
float CanvasItemEditor::snap_angle(float p_target, float p_start) const {
|
float CanvasItemEditor::snap_angle(float p_target, float p_start) const {
|
||||||
return (snap_rotation && snap_rotation_step != 0) ? Math::stepify(p_target - snap_rotation_offset, snap_rotation_step) + snap_rotation_offset : p_target;
|
return (((snap_active || snap_rotation) ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL)) && snap_rotation_step != 0) ? Math::stepify(p_target - snap_rotation_offset, snap_rotation_step) + snap_rotation_offset : p_target;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CanvasItemEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
|
void CanvasItemEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
|
||||||
|
@ -1974,10 +1975,11 @@ void CanvasItemEditor::_draw_rulers() {
|
||||||
Color font_color = get_color("font_color", "Editor");
|
Color font_color = get_color("font_color", "Editor");
|
||||||
font_color.a = 0.8;
|
font_color.a = 0.8;
|
||||||
Ref<Font> font = get_font("rulers", "EditorFonts");
|
Ref<Font> font = get_font("rulers", "EditorFonts");
|
||||||
|
bool is_snap_active = snap_active ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL);
|
||||||
|
|
||||||
// The rule transform
|
// The rule transform
|
||||||
Transform2D ruler_transform = Transform2D();
|
Transform2D ruler_transform = Transform2D();
|
||||||
if (show_grid || (snap_active && snap_grid)) {
|
if (show_grid || (is_snap_active && snap_grid)) {
|
||||||
List<CanvasItem *> selection = _get_edited_canvas_items();
|
List<CanvasItem *> selection = _get_edited_canvas_items();
|
||||||
if (snap_relative && selection.size() > 0) {
|
if (snap_relative && selection.size() > 0) {
|
||||||
ruler_transform.translate(_get_encompassing_rect_from_list(selection).position);
|
ruler_transform.translate(_get_encompassing_rect_from_list(selection).position);
|
||||||
|
|
Loading…
Reference in a new issue