properly save external resources, fixes #1924

added API to get scancode names to OS
This commit is contained in:
Juan Linietsky
2015-05-17 13:15:23 -03:00
parent 0faaa729e7
commit e72717e373
5 changed files with 84 additions and 34 deletions
+54 -31
View File
@@ -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) {