Ref<Resource> Resource::duplicate(bool p_subresources) { List<PropertyInfo> plist; get_property_list(&plist); Resource *r = (Resource *)ObjectTypeDB::instance(get_type()); ERR_FAIL_COND_V(!r, Ref<Resource>()); for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) continue; Variant p = get(E->get().name); if (p.get_type() == Variant::OBJECT && p_subresources) { RES sr = p; if (sr.is_valid()) p = sr->duplicate(true); } r->set(E->get().name, p); } return Ref<Resource>(r); }
void InspectorDock::_menu_option(int p_option) { switch (p_option) { case RESOURCE_SAVE: { _save_resource(false); } break; case RESOURCE_SAVE_AS: { _save_resource(true); } break; case OBJECT_REQUEST_HELP: { if (current) { editor->set_visible_editor(EditorNode::EDITOR_SCRIPT); emit_signal("request_help", current->get_class()); } } break; case OBJECT_COPY_PARAMS: { editor_data->apply_changes_in_editors(); if (current) editor_data->copy_object_params(current); } break; case OBJECT_PASTE_PARAMS: { editor_data->apply_changes_in_editors(); if (current) editor_data->paste_object_params(current); editor_data->get_undo_redo().clear_history(); } break; case OBJECT_UNIQUE_RESOURCES: { editor_data->apply_changes_in_editors(); if (current) { List<PropertyInfo> props; current->get_property_list(&props); Map<RES, RES> duplicates; for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) continue; Variant v = current->get(E->get().name); if (v.is_ref()) { REF ref = v; if (ref.is_valid()) { RES res = ref; if (res.is_valid()) { if (!duplicates.has(res)) { duplicates[res] = res->duplicate(); } res = duplicates[res]; current->set(E->get().name, res); } } } } } editor_data->get_undo_redo().clear_history(); editor->get_editor_plugins_over()->edit(NULL); editor->get_editor_plugins_over()->edit(current); } break; default: { if (p_option >= OBJECT_METHOD_BASE) { ERR_FAIL_COND(!current); int idx = p_option - OBJECT_METHOD_BASE; List<MethodInfo> methods; current->get_method_list(&methods); ERR_FAIL_INDEX(idx, methods.size()); String name = methods[idx].name; if (current) current->call(name); } } } }