diff options
| author | Juan Linietsky | 2016-07-06 21:43:31 -0300 |
|---|---|---|
| committer | Rémi Verschelde | 2016-07-08 19:18:09 +0200 |
| commit | f4a5963ca909b66869d97c78ff7fdf1870aa022a (patch) | |
| tree | 74a3d99d4226334dc74f886438795591d39f7e2d | |
| parent | d4cb381ce06d898cece550df9158e91939a01c9e (diff) | |
| download | godot-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.cpp | 22 | ||||
| -rw-r--r-- | scene/main/node.h | 2 |
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; |
