Browse Source

Merge pull request #4652 from Paulb23/node_duplication_position

Node duplication positions under duplicated node, issue #964
Rémi Verschelde 9 years ago
parent
commit
68dc685f1f
3 changed files with 14 additions and 1 deletions
  1. 12 0
      scene/main/node.cpp
  2. 1 0
      scene/main/node.h
  3. 1 1
      tools/editor/scene_tree_dock.cpp

+ 12 - 0
scene/main/node.cpp

@@ -749,6 +749,16 @@ void Node::add_child(Node *p_child, bool p_legible_unique_name) {
 
 }
 
+void Node::add_child_below_node(Node *p_node, Node *p_child, bool p_legible_unique_name) {
+	add_child(p_child, p_legible_unique_name);
+
+	if (is_a_parent_of(p_node)) {
+		move_child(p_child, p_node->get_position_in_parent() + 1);
+	} else {
+		WARN_PRINTS("Cannot move under node " + p_node->get_name() + " as " + p_child->get_name() + " does not share a parent")
+	}
+}
+
 
 void Node::_propagate_validate_owner() {
 
@@ -2012,6 +2022,8 @@ void Node::clear_internal_tree_resource_paths() {
 
 void Node::_bind_methods() {
 
+	ObjectTypeDB::bind_method(_MD("_add_child_below_node","node:Node","child_node:Node","legible_unique_name"),&Node::add_child_below_node,DEFVAL(false));
+
 	ObjectTypeDB::bind_method(_MD("set_name","name"),&Node::set_name);
 	ObjectTypeDB::bind_method(_MD("get_name"),&Node::get_name);
 	ObjectTypeDB::bind_method(_MD("add_child","node:Node","legible_unique_name"),&Node::add_child,DEFVAL(false));

+ 1 - 0
scene/main/node.h

@@ -190,6 +190,7 @@ public:
 	void set_name(const String& p_name);
 
 	void add_child(Node *p_child,bool p_legible_unique_name=false);
+	void add_child_below_node(Node *p_node, Node *p_child, bool p_legible_unique_name=false);
 	void remove_child(Node *p_child);
 
 	int get_child_count() const;

+ 1 - 1
tools/editor/scene_tree_dock.cpp

@@ -442,7 +442,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
 
 				dup->set_name(attempt);
 
-				editor_data->get_undo_redo().add_do_method(parent,"add_child",dup);
+				editor_data->get_undo_redo().add_do_method(parent,"_add_child_below_node",node, dup);
 				for (List<Node*>::Element *F=owned.front();F;F=F->next()) {
 
 					if (!duplimap.has(F->get())) {