Ability to rotate controls using tool, closes #3800

(cherry picked from commit e2d208f122)
This commit is contained in:
Juan Linietsky 2016-06-27 10:47:51 -03:00 committed by Rémi Verschelde
parent 6813c89021
commit c5fd6a3b69
2 changed files with 40 additions and 10 deletions

View File

@ -46,14 +46,22 @@
Variant Control::edit_get_state() const { Variant Control::edit_get_state() const {
return get_rect(); Dictionary s;
s["rect"]=get_rect();
s["rot"]=get_rotation();
s["scale"]=get_scale();
return s;
} }
void Control::edit_set_state(const Variant& p_state) { void Control::edit_set_state(const Variant& p_state) {
Rect2 state=p_state; Dictionary s=p_state;
Rect2 state=s["rect"];
set_pos(state.pos); set_pos(state.pos);
set_size(state.size); set_size(state.size);
set_rotation(s["rot"]);
set_scale(s["scale"]);
} }
void Control::set_custom_minimum_size(const Size2& p_custom) { void Control::set_custom_minimum_size(const Size2& p_custom) {

View File

@ -1380,6 +1380,8 @@ void CanvasItemEditor::_viewport_input_event(const InputEvent& p_event) {
se->undo_state=canvas_item->edit_get_state(); se->undo_state=canvas_item->edit_get_state();
if (canvas_item->cast_to<Node2D>()) if (canvas_item->cast_to<Node2D>())
se->undo_pivot=canvas_item->cast_to<Node2D>()->edit_get_pivot(); se->undo_pivot=canvas_item->cast_to<Node2D>()->edit_get_pivot();
if (canvas_item->cast_to<Control>())
se->undo_pivot=Vector2();
return; return;
} }
@ -1564,7 +1566,11 @@ void CanvasItemEditor::_viewport_input_event(const InputEvent& p_event) {
if (drag==DRAG_ROTATE) { if (drag==DRAG_ROTATE) {
Vector2 center = canvas_item->get_global_transform_with_canvas().get_origin(); Vector2 center = canvas_item->get_global_transform_with_canvas().get_origin();
if (Node2D *node = canvas_item->cast_to<Node2D>()) { {
Node2D *node = canvas_item->cast_to<Node2D>();
if (node) {
Matrix32 rot; Matrix32 rot;
rot.elements[1] = (dfrom - center).normalized(); rot.elements[1] = (dfrom - center).normalized();
rot.elements[0] = rot.elements[1].tangent(); rot.elements[0] = rot.elements[1].tangent();
@ -1573,6 +1579,22 @@ void CanvasItemEditor::_viewport_input_event(const InputEvent& p_event) {
display_rotate_from = center; display_rotate_from = center;
viewport->update(); viewport->update();
} }
}
{
Control *node = canvas_item->cast_to<Control>();
if (node) {
Matrix32 rot;
rot.elements[1] = (dfrom - center).normalized();
rot.elements[0] = rot.elements[1].tangent();
node->set_rotation(snap_angle(rot.xform_inv(dto-center).angle() + node->get_rotation(), node->get_rotation()));
display_rotate_to = dto;
display_rotate_from = center;
viewport->update();
}
}
continue; continue;
} }