void Node::_duplicate_signals(const Node* p_original,Node* p_copy) const { if (this!=p_original && get_owner()!=p_original) 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) { //user connected NodePath p = p_original->get_path_to(this); Node *copy = p_copy->get_node(p); Node *target = E->get().target->cast_to<Node>(); 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); } } } for(int i=0;i<get_child_count();i++) { get_child(i)->_duplicate_signals(p_original,p_copy); } }
Array Object::_get_signal_connection_list(const String& p_signal) const{ List<Connection> conns; get_all_signal_connections(&conns); Array ret; for (List<Connection>::Element *E=conns.front();E;E=E->next()) { Connection &c=E->get(); if (c.signal == p_signal){ Dictionary rc; rc["signal"]=c.signal; rc["method"]=c.method; rc["source"]=c.source; rc["target"]=c.target; rc["binds"]=c.binds; rc["flags"]=c.flags; ret.push_back(rc); } } return ret; }