mirror of
https://github.com/tiennm99/godot.git
synced 2026-08-05 14:23:40 +00:00
properly save external resources, fixes #1924
added API to get scancode names to OS
This commit is contained in:
@@ -610,7 +610,42 @@ static Error _fix_imported_scene_paths(Node* node, Node* root, String save_path)
|
||||
};
|
||||
|
||||
|
||||
bool EditorNode::_find_and_save_edited_subresources(Object *obj,Set<RES>& processed,int32_t flags) {
|
||||
bool EditorNode::_find_and_save_resource(RES res,Map<RES,bool>& processed,int32_t flags) {
|
||||
|
||||
if (res.is_null())
|
||||
return false;
|
||||
|
||||
if (processed.has(res)) {
|
||||
|
||||
return processed[res];
|
||||
}
|
||||
|
||||
|
||||
bool changed = res->is_edited();
|
||||
res->set_edited(false);
|
||||
|
||||
bool subchanged = _find_and_save_edited_subresources(res.ptr(),processed,flags);
|
||||
|
||||
// print_line("checking if edited: "+res->get_type()+" :: "+res->get_name()+" :: "+res->get_path()+" :: "+itos(changed)+" :: SR "+itos(subchanged));
|
||||
|
||||
if (res->get_path().is_resource_file()) {
|
||||
if (changed || subchanged) {
|
||||
//save
|
||||
print_line("Also saving modified external resource: "+res->get_path());
|
||||
Error err = ResourceSaver::save(res->get_path(),res,flags);
|
||||
|
||||
}
|
||||
processed[res]=false; //because it's a file
|
||||
return false;
|
||||
} else {
|
||||
|
||||
|
||||
processed[res]=changed;
|
||||
return changed;
|
||||
}
|
||||
}
|
||||
|
||||
bool EditorNode::_find_and_save_edited_subresources(Object *obj,Map<RES,bool>& processed,int32_t flags) {
|
||||
|
||||
bool ret_changed=false;
|
||||
List<PropertyInfo> pi;
|
||||
@@ -620,57 +655,45 @@ bool EditorNode::_find_and_save_edited_subresources(Object *obj,Set<RES>& proces
|
||||
if (!(E->get().usage&PROPERTY_USAGE_STORAGE))
|
||||
continue;
|
||||
|
||||
|
||||
|
||||
switch(E->get().type) {
|
||||
case Variant::OBJECT: {
|
||||
|
||||
RES res = obj->get(E->get().name);
|
||||
|
||||
if (res.is_null() || processed.has(res))
|
||||
break;
|
||||
|
||||
processed.insert(res);
|
||||
|
||||
bool changed = res->is_edited();
|
||||
res->set_edited(false);
|
||||
|
||||
bool subchanged = _find_and_save_edited_subresources(res.ptr(),processed,flags);
|
||||
|
||||
if (res->get_path().is_resource_file()) {
|
||||
if (changed || subchanged) {
|
||||
//save
|
||||
print_line("Also saving modified external resource: "+res->get_path());
|
||||
Error err = ResourceSaver::save(res->get_path(),res,flags);
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
if (_find_and_save_resource(res,processed,flags))
|
||||
ret_changed=true;
|
||||
}
|
||||
|
||||
|
||||
} break;
|
||||
case Variant::ARRAY: {
|
||||
|
||||
/*Array varray=p_variant;
|
||||
Array varray= obj->get(E->get().name);
|
||||
int len=varray.size();
|
||||
for(int i=0;i<len;i++) {
|
||||
|
||||
Variant v=varray.get(i);
|
||||
_find_resources(v);
|
||||
}*/
|
||||
RES res=v;
|
||||
if (_find_and_save_resource(res,processed,flags))
|
||||
ret_changed=true;
|
||||
|
||||
//_find_resources(v);
|
||||
}
|
||||
|
||||
} break;
|
||||
case Variant::DICTIONARY: {
|
||||
|
||||
/*
|
||||
Dictionary d=p_variant;
|
||||
|
||||
Dictionary d=obj->get(E->get().name);;
|
||||
List<Variant> keys;
|
||||
d.get_key_list(&keys);
|
||||
for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
|
||||
|
||||
Variant v = d[E->get()];
|
||||
_find_resources(v);
|
||||
} */
|
||||
RES res=v;
|
||||
if (_find_and_save_resource(res,processed,flags))
|
||||
ret_changed=true;
|
||||
}
|
||||
} break;
|
||||
default: {}
|
||||
}
|
||||
@@ -681,7 +704,7 @@ bool EditorNode::_find_and_save_edited_subresources(Object *obj,Set<RES>& proces
|
||||
|
||||
}
|
||||
|
||||
void EditorNode::_save_edited_subresources(Node* scene,Set<RES>& processed,int32_t flags) {
|
||||
void EditorNode::_save_edited_subresources(Node* scene,Map<RES,bool>& processed,int32_t flags) {
|
||||
|
||||
_find_and_save_edited_subresources(scene,processed,flags);
|
||||
|
||||
@@ -741,7 +764,7 @@ void EditorNode::_save_scene(String p_file) {
|
||||
|
||||
|
||||
err = ResourceSaver::save(p_file,sdata,flg);
|
||||
Set<RES> processed;
|
||||
Map<RES,bool> processed;
|
||||
_save_edited_subresources(scene,processed,flg);
|
||||
editor_data.save_editor_external_data();
|
||||
if (err==OK) {
|
||||
|
||||
Reference in New Issue
Block a user