Merge pull request #34892 from KoBeWi/copy-pasta_v7
Yet another node copy-paste PR
This commit is contained in:
@@ -2138,8 +2138,17 @@ Node *Node::duplicate(int p_flags) const {
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
Node *Node::duplicate_from_editor(Map<const Node *, Node *> &r_duplimap) const {
|
||||
return duplicate_from_editor(r_duplimap, Map<RES, RES>());
|
||||
}
|
||||
|
||||
Node *Node::duplicate_from_editor(Map<const Node *, Node *> &r_duplimap, const Map<RES, RES> &p_resource_remap) const {
|
||||
Node *dupe = _duplicate(DUPLICATE_SIGNALS | DUPLICATE_GROUPS | DUPLICATE_SCRIPTS | DUPLICATE_USE_INSTANCING | DUPLICATE_FROM_EDITOR, &r_duplimap);
|
||||
|
||||
// This is used by SceneTreeDock's paste functionality. When pasting to foreign scene, resources are duplicated.
|
||||
if (!p_resource_remap.is_empty()) {
|
||||
remap_node_resources(dupe, p_resource_remap);
|
||||
}
|
||||
|
||||
// Duplication of signals must happen after all the node descendants have been copied,
|
||||
// because re-targeting of connections from some descendant to another is not possible
|
||||
// if the emitter node comes later in tree order than the receiver
|
||||
@@ -2147,6 +2156,54 @@ Node *Node::duplicate_from_editor(Map<const Node *, Node *> &r_duplimap) const {
|
||||
|
||||
return dupe;
|
||||
}
|
||||
|
||||
void Node::remap_node_resources(Node *p_node, const Map<RES, RES> &p_resource_remap) const {
|
||||
List<PropertyInfo> props;
|
||||
p_node->get_property_list(&props);
|
||||
|
||||
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
|
||||
if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Variant v = p_node->get(E->get().name);
|
||||
if (v.is_ref()) {
|
||||
RES res = v;
|
||||
if (res.is_valid()) {
|
||||
if (p_resource_remap.has(res)) {
|
||||
p_node->set(E->get().name, p_resource_remap[res]);
|
||||
remap_nested_resources(res, p_resource_remap);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < p_node->get_child_count(); i++) {
|
||||
remap_node_resources(p_node->get_child(i), p_resource_remap);
|
||||
}
|
||||
}
|
||||
|
||||
void Node::remap_nested_resources(RES p_resource, const Map<RES, RES> &p_resource_remap) const {
|
||||
List<PropertyInfo> props;
|
||||
p_resource->get_property_list(&props);
|
||||
|
||||
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
|
||||
if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Variant v = p_resource->get(E->get().name);
|
||||
if (v.is_ref()) {
|
||||
RES res = v;
|
||||
if (res.is_valid()) {
|
||||
if (p_resource_remap.has(res)) {
|
||||
p_resource->set(E->get().name, p_resource_remap[res]);
|
||||
remap_nested_resources(res, p_resource_remap);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void Node::_duplicate_and_reown(Node *p_new_parent, const Map<Node *, Node *> &p_reown_map) const {
|
||||
|
||||
@@ -362,6 +362,9 @@ public:
|
||||
Node *duplicate_and_reown(const Map<Node *, Node *> &p_reown_map) const;
|
||||
#ifdef TOOLS_ENABLED
|
||||
Node *duplicate_from_editor(Map<const Node *, Node *> &r_duplimap) const;
|
||||
Node *duplicate_from_editor(Map<const Node *, Node *> &r_duplimap, const Map<RES, RES> &p_resource_remap) const;
|
||||
void remap_node_resources(Node *p_node, const Map<RES, RES> &p_resource_remap) const;
|
||||
void remap_nested_resources(RES p_resource, const Map<RES, RES> &p_resource_remap) const;
|
||||
#endif
|
||||
|
||||
// used by editors, to save what has changed only
|
||||
|
||||
Reference in New Issue
Block a user