You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-06 12:20:30 +00:00
Change key move behavior of canvas item editor to ignore zoom level; Add
alt + arrow key as local base move mode; Control + arrow key as local + rotation move mode
This commit is contained in:
@@ -270,7 +270,7 @@ void CanvasItemEditor::_find_canvas_items_at_rect(const Rect2& p_rect,Node* p_no
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CanvasItemEditor::_key_move(const Vector2& p_dir, bool p_snap) {
|
void CanvasItemEditor::_key_move(const Vector2& p_dir, bool p_snap, KeyMoveMODE p_move_mode) {
|
||||||
|
|
||||||
|
|
||||||
if (drag!=DRAG_NONE)
|
if (drag!=DRAG_NONE)
|
||||||
@@ -298,18 +298,36 @@ void CanvasItemEditor::_key_move(const Vector2& p_dir, bool p_snap) {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
Vector2 drag = transform.affine_inverse().basis_xform(p_dir);
|
Vector2 drag = p_dir;
|
||||||
drag = canvas_item->get_global_transform_with_canvas().affine_inverse().basis_xform(drag);
|
|
||||||
|
|
||||||
if (p_snap)
|
if (p_snap)
|
||||||
drag*=snap;
|
drag*=snap;
|
||||||
|
|
||||||
undo_redo->add_undo_method(canvas_item,"edit_set_state",canvas_item->edit_get_state());
|
undo_redo->add_undo_method(canvas_item,"edit_set_state",canvas_item->edit_get_state());
|
||||||
Rect2 local_rect = canvas_item->get_item_rect();
|
|
||||||
local_rect.pos+=drag;
|
|
||||||
//canvas_item->edit_set_rect(local_rect);
|
|
||||||
undo_redo->add_do_method(canvas_item,"edit_set_rect",local_rect);
|
|
||||||
|
|
||||||
|
if (p_move_mode == MOVE_VIEW_BASE) {
|
||||||
|
|
||||||
|
// drag = transform.affine_inverse().basis_xform(p_dir); // zoom sensitive
|
||||||
|
drag = canvas_item->get_global_transform_with_canvas().affine_inverse().basis_xform(drag);
|
||||||
|
Rect2 local_rect = canvas_item->get_item_rect();
|
||||||
|
local_rect.pos+=drag;
|
||||||
|
undo_redo->add_do_method(canvas_item,"edit_set_rect",local_rect);
|
||||||
|
|
||||||
|
} else { // p_move_mode==MOVE_LOCAL_BASE || p_move_mode==MOVE_LOCAL_WITH_ROT
|
||||||
|
|
||||||
|
if (Node2D *node_2d = canvas_item->cast_to<Node2D>()) {
|
||||||
|
|
||||||
|
if (p_move_mode == MOVE_LOCAL_WITH_ROT) {
|
||||||
|
Matrix32 m;
|
||||||
|
m.rotate( node_2d->get_rot() );
|
||||||
|
drag = m.xform(drag);
|
||||||
|
}
|
||||||
|
node_2d->set_pos(node_2d->get_pos() + drag);
|
||||||
|
|
||||||
|
} else if (Control *control = canvas_item->cast_to<Control>()) {
|
||||||
|
|
||||||
|
control->set_pos(control->get_pos()+drag);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
undo_redo->commit_action();
|
undo_redo->commit_action();
|
||||||
@@ -1113,19 +1131,20 @@ void CanvasItemEditor::_viewport_input_event(const InputEvent& p_event) {
|
|||||||
|
|
||||||
const InputEventKey &k=p_event.key;
|
const InputEventKey &k=p_event.key;
|
||||||
|
|
||||||
if (p_event.key.mod.alt || p_event.key.mod.control || p_event.key.mod.meta)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (k.pressed && drag==DRAG_NONE) {
|
if (k.pressed && drag==DRAG_NONE) {
|
||||||
|
|
||||||
|
KeyMoveMODE move_mode = MOVE_VIEW_BASE;
|
||||||
|
if (k.mod.alt) move_mode = MOVE_LOCAL_BASE;
|
||||||
|
if (k.mod.control || k.mod.meta) move_mode = MOVE_LOCAL_WITH_ROT;
|
||||||
|
|
||||||
if (k.scancode==KEY_UP)
|
if (k.scancode==KEY_UP)
|
||||||
_key_move(Vector2(0,-1),k.mod.shift);
|
_key_move( Vector2(0,-1), k.mod.shift, move_mode );
|
||||||
else if (k.scancode==KEY_DOWN)
|
else if (k.scancode==KEY_DOWN)
|
||||||
_key_move(Vector2(0,1),k.mod.shift);
|
_key_move( Vector2(0,1), k.mod.shift, move_mode );
|
||||||
else if (k.scancode==KEY_LEFT)
|
else if (k.scancode==KEY_LEFT)
|
||||||
_key_move(Vector2(-1,0),k.mod.shift);
|
_key_move( Vector2(-1,0), k.mod.shift, move_mode );
|
||||||
else if (k.scancode==KEY_RIGHT)
|
else if (k.scancode==KEY_RIGHT)
|
||||||
_key_move(Vector2(1,0),k.mod.shift);
|
_key_move( Vector2(1,0), k.mod.shift, move_mode );
|
||||||
else if (k.scancode==KEY_ESCAPE) {
|
else if (k.scancode==KEY_ESCAPE) {
|
||||||
editor_selection->clear();
|
editor_selection->clear();
|
||||||
viewport->update();
|
viewport->update();
|
||||||
|
|||||||
@@ -122,6 +122,12 @@ class CanvasItemEditor : public VBoxContainer {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum KeyMoveMODE {
|
||||||
|
MOVE_VIEW_BASE,
|
||||||
|
MOVE_LOCAL_BASE,
|
||||||
|
MOVE_LOCAL_WITH_ROT
|
||||||
|
};
|
||||||
|
|
||||||
EditorSelection *editor_selection;
|
EditorSelection *editor_selection;
|
||||||
|
|
||||||
Tool tool;
|
Tool tool;
|
||||||
@@ -220,7 +226,7 @@ class CanvasItemEditor : public VBoxContainer {
|
|||||||
void _remove_canvas_item(CanvasItem *p_canvas_item);
|
void _remove_canvas_item(CanvasItem *p_canvas_item);
|
||||||
void _clear_canvas_items();
|
void _clear_canvas_items();
|
||||||
void _visibility_changed(ObjectID p_canvas_item);
|
void _visibility_changed(ObjectID p_canvas_item);
|
||||||
void _key_move(const Vector2& p_dir, bool p_snap);
|
void _key_move(const Vector2& p_dir, bool p_snap, KeyMoveMODE p_move_mode);
|
||||||
|
|
||||||
DragType _find_drag_type(const Matrix32& p_xform, const Rect2& p_local_rect, const Point2& p_click, Vector2& r_point);
|
DragType _find_drag_type(const Matrix32& p_xform, const Rect2& p_local_rect, const Point2& p_click, Vector2& r_point);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user