Explorar o código

Merge pull request #393 from marynate/PR-2d-key-move

Tune 2d editor arrow key move mode
reduz %!s(int64=11) %!d(string=hai) anos
pai
achega
cc6839ef2f

+ 34 - 15
tools/editor/plugins/canvas_item_editor_plugin.cpp

@@ -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)
@@ -298,18 +298,36 @@ void CanvasItemEditor::_key_move(const Vector2& p_dir, bool p_snap) {
 			continue;
 
 
-		Vector2 drag =  transform.affine_inverse().basis_xform(p_dir);
-		drag = canvas_item->get_global_transform_with_canvas().affine_inverse().basis_xform(drag);
-
+		Vector2 drag = p_dir;
 		if (p_snap)
 			drag*=snap;
 
 		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();
@@ -1113,19 +1131,20 @@ void CanvasItemEditor::_viewport_input_event(const InputEvent& p_event) {
 
 		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) {
 
+			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)
-				_key_move(Vector2(0,-1),k.mod.shift);
+				_key_move( Vector2(0,-1), k.mod.shift, move_mode );
 			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)
-				_key_move(Vector2(-1,0),k.mod.shift);
+				_key_move( Vector2(-1,0), k.mod.shift, move_mode );
 			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) {
 				editor_selection->clear();
 				viewport->update();

+ 7 - 1
tools/editor/plugins/canvas_item_editor_plugin.h

@@ -122,6 +122,12 @@ class CanvasItemEditor : public VBoxContainer {
 
 	};
 
+	enum KeyMoveMODE {
+		MOVE_VIEW_BASE,
+		MOVE_LOCAL_BASE,
+		MOVE_LOCAL_WITH_ROT
+	};
+
 	EditorSelection *editor_selection;
 
 	Tool tool;
@@ -220,7 +226,7 @@ class CanvasItemEditor : public VBoxContainer {
 	void _remove_canvas_item(CanvasItem *p_canvas_item);
 	void _clear_canvas_items();
 	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);