diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 50b0fe224ed..edc97cbf464 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -2081,6 +2081,10 @@ void Node::update_configuration_warning() { } +bool Node::is_owned_by_parent() const { + data.parent_owned; +} + 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)); diff --git a/scene/main/node.h b/scene/main/node.h index a3b8d8de818..88334f32f0f 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -313,6 +313,8 @@ public: NodePath get_import_path() const; #endif + bool is_owned_by_parent() const; + void get_argument_options(const StringName& p_function,int p_idx,List*r_options) const; void clear_internal_tree_resource_paths(); diff --git a/tools/editor/scene_tree_dock.cpp b/tools/editor/scene_tree_dock.cpp index 69d6d97980d..30ffdf6664e 100644 --- a/tools/editor/scene_tree_dock.cpp +++ b/tools/editor/scene_tree_dock.cpp @@ -1388,6 +1388,13 @@ void SceneTreeDock::_create() { } String newname=n->get_name(); + + List to_erase; + for(int i=0;iget_child_count();i++) { + if (n->get_child(i)->get_owner()==NULL && n->is_owned_by_parent()) { + to_erase.push_back(n->get_child(i)); + } + } n->replace_by(newnode,true); if (n==edited_scene) { @@ -1408,6 +1415,11 @@ void SceneTreeDock::_create() { memdelete(n); + while(to_erase.front()) { + memdelete(to_erase.front()->get()); + to_erase.pop_front(); + } + }