aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky2016-07-06 21:43:31 -0300
committerRémi Verschelde2016-07-08 19:18:09 +0200
commitf4a5963ca909b66869d97c78ff7fdf1870aa022a (patch)
tree74a3d99d4226334dc74f886438795591d39f7e2d
parentd4cb381ce06d898cece550df9158e91939a01c9e (diff)
downloadgodot-f4a5963ca909b66869d97c78ff7fdf1870aa022a.tar.gz
godot-f4a5963ca909b66869d97c78ff7fdf1870aa022a.tar.zst
godot-f4a5963ca909b66869d97c78ff7fdf1870aa022a.zip
Fix several bugs related to node duplication and signals, closes #5405
(cherry picked from commit 17e4ead62a949e2a1568574228a157ea4b403d30)
Diffstat (limited to '')
-rw-r--r--scene/main/node.cpp22
-rw-r--r--scene/main/node.h2
2 files changed, 21 insertions, 3 deletions
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index bab46cce1..44edebf58 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -1488,7 +1488,7 @@ int Node::get_position_in_parent() const {
-Node *Node::duplicate(bool p_use_instancing) const {
+Node *Node::_duplicate(bool p_use_instancing) const {
Node *node=NULL;
@@ -1567,9 +1567,21 @@ Node *Node::duplicate(bool p_use_instancing) const {
node->add_child(dup);
}
+
return node;
}
+Node *Node::duplicate(bool p_use_instancing) const {
+
+ Node* dupe = _duplicate(p_use_instancing);
+
+ if (dupe) {
+ _duplicate_signals(this,dupe);
+ }
+
+ return dupe;
+}
+
void Node::_duplicate_and_reown(Node* p_new_parent, const Map<Node*,Node*>& p_reown_map) const {
@@ -1639,12 +1651,13 @@ void Node::_duplicate_and_reown(Node* p_new_parent, const Map<Node*,Node*>& p_re
void Node::_duplicate_signals(const Node* p_original,Node* p_copy) const {
- if (this!=p_original && get_owner()!=p_original)
+ if (this!=p_original && (get_owner()!=p_original && get_owner()!=p_original->get_owner()))
return;
List<Connection> conns;
get_all_signal_connections(&conns);
+
for (List<Connection>::Element *E=conns.front();E;E=E->next()) {
if (E->get().flags&CONNECT_PERSIST) {
@@ -1653,14 +1666,17 @@ void Node::_duplicate_signals(const Node* p_original,Node* p_copy) const {
Node *copy = p_copy->get_node(p);
Node *target = E->get().target->cast_to<Node>();
- if (!target)
+ if (!target) {
continue;
+ }
NodePath ptarget = p_original->get_path_to(target);
Node *copytarget = p_copy->get_node(ptarget);
+
if (copy && copytarget) {
copy->connect(E->get().signal,copytarget,E->get().method,E->get().binds,CONNECT_PERSIST);
}
+
}
}
diff --git a/scene/main/node.h b/scene/main/node.h
index 560a2e588..6b2e6c9ac 100644
--- a/scene/main/node.h
+++ b/scene/main/node.h
@@ -136,6 +136,8 @@ private:
void _duplicate_signals(const Node* p_original,Node* p_copy) const;
void _duplicate_and_reown(Node* p_new_parent, const Map<Node*,Node*>& p_reown_map) const;
+ Node *_duplicate(bool p_use_instancing) const;
+
Array _get_children() const;
Array _get_groups() const;