summaryrefslogtreecommitdiff
path: root/scene/main
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-06-13 15:50:31 -0300
committerGitHub <noreply@github.com>2016-06-13 15:50:31 -0300
commitd03f1131d75204fc0eb2d30896d4aff132c790aa (patch)
tree9bec2071a9b75e6a407d9f416190708dc7c7f4c1 /scene/main
parentfc54830f1aa84534233c2a599e0121eba4255a07 (diff)
parentdc2ea39f242979f69be3469bea8ef2467ab98b34 (diff)
Merge pull request #5058 from neikeq/pr-issue-1461
Preserve signal connections when replacing target node
Diffstat (limited to 'scene/main')
-rw-r--r--scene/main/node.cpp16
-rw-r--r--scene/main/node.h2
2 files changed, 17 insertions, 1 deletions
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index f8af83e23b..cfc7116d19 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -1770,6 +1770,8 @@ void Node::replace_by(Node* p_node,bool p_keep_data) {
}
}
+ _replace_connections_target(p_node);
+
if (data.owner) {
for(int i=0;i<get_child_count();i++)
find_owned_by(data.owner,get_child(i),&owned_by_owner);
@@ -1808,6 +1810,20 @@ void Node::replace_by(Node* p_node,bool p_keep_data) {
}
+void Node::_replace_connections_target(Node* p_new_target) {
+
+ List<Connection> cl;
+ get_signals_connected_to_this(&cl);
+
+ for(List<Connection>::Element *E=cl.front();E;E=E->next()) {
+
+ Connection &c=E->get();
+
+ c.source->disconnect(c.signal,this,c.method);
+ c.source->connect(c.signal,p_new_target,c.method,c.binds,c.flags);
+ }
+}
+
Vector<Variant> Node::make_binds(VARIANT_ARG_DECLARE) {
diff --git a/scene/main/node.h b/scene/main/node.h
index d099f6e773..a3b8d8de81 100644
--- a/scene/main/node.h
+++ b/scene/main/node.h
@@ -121,7 +121,7 @@ private:
Node *_get_node(const NodePath& p_path) const;
Node *_get_child_by_name(const StringName& p_name) const;
-
+ void _replace_connections_target(Node* p_new_target);
void _validate_child_name(Node *p_name, bool p_force_human_readable=false);