1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-07 12:30:27 +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:
marynate
2014-05-09 15:11:24 +08:00
parent 1024692041
commit 14350d2c41
2 changed files with 41 additions and 16 deletions

View File

@@ -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());
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(); Rect2 local_rect = canvas_item->get_item_rect();
local_rect.pos+=drag; local_rect.pos+=drag;
//canvas_item->edit_set_rect(local_rect);
undo_redo->add_do_method(canvas_item,"edit_set_rect",local_rect); 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();

View File

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