summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-06-20 22:57:07 -0300
committerJuan Linietsky <reduzio@gmail.com>2016-06-20 22:57:07 -0300
commitd76ee09774c546476b350c15a4197d2b9ae160dc (patch)
treed01b955274aac8bd3bfc8480bcdad60f5d16d143
parent9b8f2741aee4604bd7a84ac746fae58ae06a4267 (diff)
property remove parent owned nodes when using replace, fixes #4128
-rw-r--r--scene/main/node.cpp4
-rw-r--r--scene/main/node.h2
-rw-r--r--tools/editor/scene_tree_dock.cpp12
3 files changed, 18 insertions, 0 deletions
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index 50b0fe224e..edc97cbf46 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 a3b8d8de81..88334f32f0 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<String>*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 69d6d97980..30ffdf6664 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<Node*> to_erase;
+ for(int i=0;i<n->get_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();
+ }
+
}