rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=04e81aa200c399f28acadef1ed59c0313c3c6873
commit 04e81aa200c399f28acadef1ed59c0313c3c6873 Author: Andrii Kroitor <[email protected]> Date: Wed Jun 8 11:28:14 2016 +0300 resource manager: refactor --- src/bin/common/validator.c | 14 +- src/bin/project_manager/group_manager.c | 250 ++++++++++++++-------------- src/bin/project_manager/project_manager.c | 37 ++--- src/bin/project_manager/resource_manager.c | 258 ++++++++++++++++++++++------- src/bin/project_manager/resource_manager.h | 117 +++++-------- src/bin/ui/colorclass_manager.c | 15 +- src/bin/ui/image_manager.c | 20 ++- src/bin/ui/popup.c | 6 +- src/bin/ui/property/property_group.c | 15 +- src/bin/ui/sound_manager.c | 34 ++-- src/bin/ui/style_manager.c | 22 ++- src/bin/ui/tabs.c | 10 +- src/bin/ui/workspace/group_navigator.c | 24 +-- src/bin/ui/workspace/groupview_calc.c | 12 +- src/bin/ui/workspace/workspace.c | 94 +++++++---- 15 files changed, 541 insertions(+), 387 deletions(-) diff --git a/src/bin/common/validator.c b/src/bin/common/validator.c index 5875c83..6659f16 100644 --- a/src/bin/common/validator.c +++ b/src/bin/common/validator.c @@ -83,7 +83,8 @@ resource_name_validator_status_get(Resource_Name_Validator *validator) Eina_Bool resource_name_validator_helper(void *data, const Eo_Event *event) { - Resource *res; + Resource *res = NULL; + Resource request; Elm_Validate_Content *vc = event->info; Resource_Name_Validator *validator = (Resource_Name_Validator *)data; @@ -94,10 +95,13 @@ resource_name_validator_helper(void *data, const Eo_Event *event) if (validator->status == ELM_REG_NOERROR) /* new name match regex */ { /* check if resource with this name already exists in list */ - if (validator->sorted) - res = pm_resource_get(*validator->list, vc->text); - else - res = pm_resource_unsorted_get(*validator->list, vc->text); + if (eina_list_data_get(*validator->list)) + { + request.name = vc->text; + request.resource_type = ((Resource *)eina_list_data_get(*validator->list))->resource_type; + TODO("remove sorted flag"); + res = resource_get(*validator->list, &request); + } if (!res) /* name is free */ validator->status = ELM_REG_NOERROR; diff --git a/src/bin/project_manager/group_manager.c b/src/bin/project_manager/group_manager.c index f116415..15e7daf 100644 --- a/src/bin/project_manager/group_manager.c +++ b/src/bin/project_manager/group_manager.c @@ -76,8 +76,8 @@ gm_group_edit_object_reload(Project *pro, Group *group) EINA_LIST_FOREACH(group->parts, l, part) edje_edit_part_selected_state_set(group->edit_object, part->name, - part->current_state->parsed_name, - part->current_state->parsed_val); + part->current_state->name, + part->current_state->val); } void @@ -415,62 +415,67 @@ gm_group_used_fonts_get(const char *edj, const char *group) State * gm_state_add(Project *pro, Part *part, const char *state_name) { + Resource *resource, request; State *state; - Eina_Stringshare *image_name, *name; + Eina_Stringshare *parsed_state_name, *image_name, *name; + double val; Eina_List *tween_list, *l; assert(pro != NULL); assert(part != NULL); assert(state_name != NULL); - state = mem_calloc(1, sizeof(State)); - state->name = eina_stringshare_add(state_name); + state_name_split(state_name, &parsed_state_name, &val); + + state = (State *) resource_add(parsed_state_name, RESOURCE_TYPE_STATE); + state->val = val; state->part = part; + eina_stringshare_del(parsed_state_name); - part->states = eina_list_sorted_insert(part->states, (Eina_Compare_Cb) resource_cmp, state); + resource_insert(&part->states, (Resource *)state); /* default 0.0 should be allways first state */ if (part->current_state == NULL) part->current_state = state; - state_name_split(state_name, &state->parsed_name, &state->parsed_val); - - #define USAGE_ADD(TYPE, USAGE_LIST) \ + #define USAGE_ADD(TYPE, LIST, USAGE_TYPE) \ name = edje_edit_state_ ## TYPE ## _get(part->group->edit_object, \ part->name, \ - state->parsed_name, \ - state->parsed_val); \ + state->name, \ + state->val); \ if (name) \ { \ - pm_resource_usage_add(USAGE_LIST, name, state); \ + request.resource_type = USAGE_TYPE; \ + request.name = name; \ + resource = resource_get(LIST, &request); \ + resource_used_in_add(resource, (Resource *)state); \ edje_edit_string_free(name); \ } #define COLORCLASS_USAGE_ADD() \ name = edje_edit_state_color_class_get(part->group->edit_object, \ part->name, \ - state->parsed_name, \ - state->parsed_val); \ + state->name, \ + state->val); \ if (name) \ { \ - if (!pm_resource_usage_add(pro->colorclasses, name, state)) \ + request.resource_type = RESOURCE_TYPE_COLORCLASS; \ + request.name = name; \ + resource = resource_get(pro->colorclasses, &request); \ + if (!resource) \ { \ /* Colorclass can be specified but not defined in edc. If colorclass don't exist yet adding it */ \ TODO("move this code to colorclass resource manager"); \ edje_edit_color_class_add(pro->global_object, name); \ - Colorclass_Resource *res = mem_calloc(1, sizeof(Colorclass_Resource)); \ - res->name = eina_stringshare_add(name); \ + Colorclass_Resource *res = (Colorclass_Resource *)resource_add(name, RESOURCE_TYPE_COLORCLASS); \ res->color1.r = res->color1.g = res->color1.b = res->color1.a = 255; \ res->color2.r = res->color2.g = res->color2.b = res->color2.a = 255; \ res->color3.r = res->color3.g = res->color3.b = res->color3.a = 255; \ - pro->colorclasses = eina_list_sorted_insert(pro->colorclasses, (Eina_Compare_Cb) resource_cmp, res); \ - if (!pm_resource_usage_add(pro->colorclasses, name, state)) \ - { \ - ERR("Err: resource not found: %s", name); \ - abort(); \ - }; \ + resource = (Resource *) res; \ + resource_insert(&pro->colorclasses, resource); \ } \ + resource_used_in_add(resource, (Resource *)state); \ edje_edit_string_free(name); \ } @@ -486,23 +491,28 @@ gm_state_add(Project *pro, Part *part, const char *state_name) case EDJE_PART_TYPE_IMAGE: COLORCLASS_USAGE_ADD(); - USAGE_ADD(image, pro->images); + USAGE_ADD(image, pro->images, RESOURCE_TYPE_IMAGE); tween_list = edje_edit_state_tweens_list_get(part->group->edit_object, part->name, - state->parsed_name, - state->parsed_val); + state->name, + state->val); EINA_LIST_FOREACH(tween_list, l, image_name) - pm_resource_usage_add(pro->images, image_name, state); + { + request.resource_type = RESOURCE_TYPE_IMAGE; + request.name = image_name; + resource = resource_get(pro->images, &request); + resource_used_in_add(resource, (Resource *)state); + } edje_edit_string_list_free(tween_list); break; case EDJE_PART_TYPE_TEXT: COLORCLASS_USAGE_ADD(); - USAGE_ADD(font, pro->fonts); + //USAGE_ADD(font, pro->fonts, RESOURCE_TYPE_FONT); break; case EDJE_PART_TYPE_TEXTBLOCK: - USAGE_ADD(text_style, pro->styles); + USAGE_ADD(text_style, pro->styles, RESOURCE_TYPE_STYLE); break; default: break; @@ -515,6 +525,7 @@ gm_state_add(Project *pro, Part *part, const char *state_name) Part * gm_part_add(Project *pro, Group *group, const char *part_name) { + Resource *resource, request; Part *part; Eina_List *states, *l; Eina_Stringshare *state_name, *group_name, *item_name; @@ -523,12 +534,11 @@ gm_part_add(Project *pro, Group *group, const char *part_name) assert(group != NULL); assert(part_name != NULL); - part = mem_calloc(1, sizeof(Part)); - part->name = eina_stringshare_add(part_name); + part = (Part*)resource_add(part_name, RESOURCE_TYPE_PART); part->group = group; part->type = edje_edit_part_type_get(group->edit_object, part_name); part->visible = true; - group->parts = eina_list_append(group->parts, part); + resource_insert(&group->parts, (Resource *)part); states = edje_edit_part_states_list_get(group->edit_object, part_name); EINA_LIST_FOREACH(states, l, state_name) gm_state_add(pro, part, state_name); @@ -543,7 +553,10 @@ gm_part_add(Project *pro, Group *group, const char *part_name) part->name); \ if (group_name) \ { \ - pm_resource_usage_add(pro->groups, group_name, part); \ + request.resource_type = RESOURCE_TYPE_GROUP; \ + request.name = group_name; \ + resource = resource_get(pro->groups, &request); \ + resource_used_in_add(resource, (Resource *)part); \ edje_edit_string_free(group_name); \ } @@ -558,7 +571,11 @@ gm_part_add(Project *pro, Group *group, const char *part_name) item_name); if (group_name) { - pm_resource_usage_add(pro->groups, group_name, part); + request.resource_type = RESOURCE_TYPE_GROUP; + request.name = group_name; + resource = resource_get(pro->groups, &request); + TODO("replace with item"); + resource_used_in_add(resource, (Resource *)part); edje_edit_string_free(group_name); } } @@ -584,13 +601,15 @@ gm_part_add(Project *pro, Group *group, const char *part_name) static void _group_load(Project *pro, Group *group) { + Resource request; + State state_request; Eina_Stringshare *main_group_name; Eina_List *parts, *l, *lt, *programs, *targets, *datas; Eina_Stringshare *part_name, *program_name, *target_name, *state_name, - *state_full_name, *sample_name, *tone_name, *group_data_name; + *sample_name, *tone_name, *group_data_name; double state_val; Part *part; - State *state; + Resource *state, *sound, *tone; Program *program; assert(pro != NULL); @@ -603,14 +622,10 @@ _group_load(Project *pro, Group *group) if (edje_edit_group_alias_is(group->edit_object, group->name)) { main_group_name = edje_edit_group_aliased_get(group->edit_object, group->name); - group->main_group = pm_resource_get(pro->groups, main_group_name); - if (!(group->main_group)) - { - group->main_group = mem_calloc(1, sizeof(Group)); - group->main_group->name = eina_stringshare_add(main_group_name); - pro->groups = eina_list_append(pro->groups, group->main_group); - } - group->main_group->aliases = eina_list_sorted_insert(group->main_group->aliases, (Eina_Compare_Cb)resource_cmp, group); + request.resource_type = RESOURCE_TYPE_GROUP; + request.name = main_group_name; + group->main_group = (Group *)resource_get(pro->groups, &request); + resource_insert(&group->main_group->aliases, (Resource *)group); edje_edit_string_free(main_group_name); } else @@ -627,10 +642,9 @@ _group_load(Project *pro, Group *group) programs = edje_edit_programs_list_get(group->edit_object); EINA_LIST_FOREACH(programs, l, program_name) { - program = mem_calloc(1, sizeof(Program)); - program->name = eina_stringshare_add(program_name); + program = (Program *)resource_add(program_name, RESOURCE_TYPE_PROGRAM); program->type = edje_edit_program_action_get(group->edit_object, program_name); - group->programs = eina_list_sorted_insert(group->programs, (Eina_Compare_Cb)resource_cmp, program); + resource_insert(&group->programs, (Resource *)program); } edje_edit_string_list_free(programs); EINA_LIST_FOREACH(group->programs, l, program) @@ -641,23 +655,24 @@ _group_load(Project *pro, Group *group) targets = edje_edit_program_targets_get(group->edit_object, program->name); state_name = edje_edit_program_state_get(group->edit_object, program->name); state_val = edje_edit_program_value_get(group->edit_object, program->name); - state_full_name = eina_stringshare_printf("%s %.2f", state_name, state_val); + state_request.name = state_name; + state_request.val = state_val; + state_request.resource_type = RESOURCE_TYPE_STATE; eina_stringshare_del(state_name); EINA_LIST_FOREACH(targets, lt, target_name) { - part = (Part *) pm_resource_unsorted_get(group->parts, target_name); - state = (State *) pm_resource_get(part->states, state_full_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = target_name; + part = (Part *) resource_get(group->parts, &request); + state = resource_get(part->states, (Resource *)&state_request); if (state) - state->used_in = eina_list_sorted_insert(state->used_in, - (Eina_Compare_Cb) resource_cmp, - program); + resource_used_in_add(state, (Resource *)program); else { TODO("Handle programs with states that don't exist"); } } - eina_stringshare_del(state_full_name); edje_edit_string_list_free(targets); break; case EDJE_ACTION_TYPE_DRAG_VAL_SET: @@ -665,17 +680,28 @@ _group_load(Project *pro, Group *group) case EDJE_ACTION_TYPE_DRAG_VAL_PAGE: targets = edje_edit_program_targets_get(group->edit_object, program->name); EINA_LIST_FOREACH(targets, lt, target_name) - pm_resource_usage_unsorted_add(group->parts, target_name, (void *) program); + { + request.resource_type = RESOURCE_TYPE_PART; + request.name = target_name; + part = (Part *) resource_get(group->parts, &request); + resource_used_in_add((Resource *)part, (Resource *)program); + } edje_edit_string_list_free(targets); break; case EDJE_ACTION_TYPE_SOUND_SAMPLE: sample_name = edje_edit_program_sample_name_get(group->edit_object, program->name); - pm_resource_usage_add(pro->sounds, sample_name, (void *) program); + request.resource_type = RESOURCE_TYPE_SOUND; + request.name = sample_name; + sound = resource_get(pro->sounds, &request); + resource_used_in_add(sound, (Resource *)program); eina_stringshare_del(sample_name); break; case EDJE_ACTION_TYPE_SOUND_TONE: tone_name = edje_edit_program_tone_name_get(group->edit_object, program->name); - pm_resource_usage_add(pro->tones, tone_name, (void *) program); + request.resource_type = RESOURCE_TYPE_TONE; + request.name = tone_name; + tone = resource_get(pro->tones, &request); + resource_used_in_add(tone, (Resource *)program); eina_stringshare_del(tone_name); break; default: @@ -697,9 +723,8 @@ gm_group_add(Project *pro, const char *group_name) assert(pro != NULL); assert(group_name != NULL); - group = mem_calloc(1, sizeof(Group)); - group->name = eina_stringshare_add(group_name); - pro->groups = eina_list_sorted_insert(pro->groups, (Eina_Compare_Cb) resource_cmp, group); + group = (Group *)resource_add(group_name, RESOURCE_TYPE_GROUP); + resource_insert(&pro->groups, (Resource *)group); _group_load(pro, group); evas_object_smart_callback_call(ap.win, SIGNAL_GROUP_ADDED, (void *)group); @@ -732,9 +757,8 @@ gm_group_del(Project *pro, Group *group) } EINA_LIST_FREE(group->programs, program) { - eina_stringshare_del(program->name); assert(program->used_in == NULL); - free(program); + resource_free((Resource *)program); } pro->groups = eina_list_remove(pro->groups, group); eina_stringshare_del(group->widget); @@ -743,8 +767,7 @@ gm_group_del(Project *pro, Group *group) evas_object_smart_callback_call(ap.win, SIGNAL_GROUP_DELETED, (void *)group->name); /* delete group name after call signal, because the group name need in the * callbacks */ - eina_stringshare_del(group->name); - free(group); + resource_free((Resource *)group); } Eina_Bool @@ -828,8 +851,7 @@ gm_groups_load(Project *pro) } if (!check) continue; } - group = mem_calloc(1, sizeof(Group)); - group->name = eina_stringshare_add(group_name); + group = (Group *)resource_add(group_name, RESOURCE_TYPE_GROUP); pro->groups = eina_list_append(pro->groups, group); } edje_file_collection_list_free(collections); @@ -851,7 +873,6 @@ gm_groups_free(Project *pro) EINA_LIST_FREE(pro->groups, group) { - eina_stringshare_del(group->name); eina_list_free(group->used_in); eina_stringshare_del(group->widget); eina_stringshare_del(group->class); @@ -860,28 +881,24 @@ gm_groups_free(Project *pro) EINA_LIST_FREE(group->parts, part) { - eina_stringshare_del(part->name); eina_list_free(part->used_in); EINA_LIST_FREE(part->states, state) { - eina_stringshare_del(state->name); - eina_stringshare_del(state->parsed_name); eina_list_free(state->used_in); - free(state); + resource_free((Resource *)state); } EINA_LIST_FREE(part->items, item_name) eina_stringshare_del(item_name); - free(part); + resource_free((Resource *)part); } EINA_LIST_FREE(group->programs, program) { - eina_stringshare_del(program->name); eina_list_free(program->used_in); - free(program); + resource_free((Resource *)program); } /* object should be deleted before freeing groups list*/ assert(group->edit_object == NULL); - free(group); + resource_free((Resource *)group); } } @@ -897,8 +914,8 @@ gm_state_del(Project *pro, State *state) #define USAGE_DEL(TYPE, USAGE_LIST) \ name = edje_edit_state_ ## TYPE ## _get(state->part->group->edit_object, \ state->part->name, \ - state->parsed_name, \ - state->parsed_val); \ + state->name, \ + state->val); \ if (name) \ { \ pm_resource_usage_del(USAGE_LIST, name, state); \ @@ -921,8 +938,8 @@ TODO("fix usage adding on properties change before using this code") tween_list = edje_edit_state_tweens_list_get(state->part->group->edit_object, state->part->name, - state->parsed_name, - state->parsed_val); + state->name, + state->val); EINA_LIST_FOREACH(tween_list, l, image_name) pm_resource_usage_del(pro->images, image_name, state); edje_edit_string_list_free(tween_list); @@ -943,10 +960,8 @@ TODO("fix usage adding on properties change before using this code") } #endif state->used_in = eina_list_free(state->used_in); - state->part->states = eina_list_remove(state->part->states, state); - eina_stringshare_del(state->parsed_name); - eina_stringshare_del(state->name); - free(state); + resource_remove(&state->part->states, (Resource *)state); + resource_free((Resource *)state); #undef USAGE_DEL } @@ -986,6 +1001,7 @@ void gm_part_del(Project *pro, Part* part) { State *state; + Resource *group, request; const char *group_name, *item_name; Eina_List *l; @@ -997,7 +1013,10 @@ gm_part_del(Project *pro, Part* part) part->name); \ if (group_name) \ { \ - pm_resource_usage_del(pro->groups, group_name, part); \ + request.resource_type = RESOURCE_TYPE_GROUP; \ + request.name = group_name; \ + group = resource_get(pro->groups, &request); \ + resource_used_in_del(group, (Resource *)part); \ edje_edit_string_free(group_name); \ } @@ -1012,7 +1031,10 @@ gm_part_del(Project *pro, Part* part) item_name); if (group_name) { - pm_resource_usage_del(pro->groups, group_name, part); + request.resource_type = RESOURCE_TYPE_GROUP; + request.name = group_name; + group = resource_get(pro->groups, &request); + resource_used_in_del(group, (Resource *)part); edje_edit_string_free(group_name); } } @@ -1099,34 +1121,24 @@ gm_program_add(Project *pro, Group *group, Eina_Stringshare *program_name) assert(program_name != NULL); assert(group != NULL); - program = mem_calloc(1, sizeof(Program)); - program->name = eina_stringshare_add(program_name); + program = (Program *)resource_add(program_name, RESOURCE_TYPE_PROGRAM); program->type = edje_edit_program_action_get(group->edit_object, program_name); - group->programs = eina_list_sorted_insert(group->programs, (Eina_Compare_Cb)resource_cmp, program); + resource_insert(&group->programs, (Resource *)program); } void gm_program_del(Project *pro, Group *group, Eina_Stringshare *program_name) { - Eina_List *l; - Resource *program; + Resource *program, request; assert(pro != NULL); assert(program_name != NULL); assert(group != NULL); - program = pm_resource_get(group->programs, program_name); - - assert(program != NULL); - - l = eina_list_data_find_list(group->programs, program); - - assert(l != NULL); - - group->programs = eina_list_remove_list(group->programs, l); - eina_stringshare_del(program->name); - eina_list_free(program->used_in); - free(program); + request.resource_type = RESOURCE_TYPE_PROGRAM; + request.name = program_name; + program = resource_remove(&group->programs, &request); + resource_free(program); } void @@ -1138,53 +1150,37 @@ gm_group_data_add(Project *pro, Group *group, Eina_Stringshare *group_data_name) assert(group_data_name != NULL); assert(group != NULL); - group_data = mem_calloc(1, sizeof(Program)); - group_data->name = eina_stringshare_add(group_data_name); - group->data_items = eina_list_sorted_insert(group->data_items, (Eina_Compare_Cb)resource_cmp, group_data); + group_data = (Resource *)resource_add(group_data_name, RESOURCE_TYPE_DATA); + resource_insert(&group->data_items, group_data); } void gm_group_data_del(Project *pro, Group *group, Eina_Stringshare *group_data_name) { - Eina_List *l; - Resource *group_data; + Resource *group_data, request; assert(pro != NULL); assert(group_data_name != NULL); assert(group != NULL); - group_data = pm_resource_get(group->data_items, group_data_name); - - assert(group_data != NULL); - - l = eina_list_data_find_list(group->data_items, group_data); - - assert(l != NULL); - - group->data_items = eina_list_remove_list(group->data_items, l); - eina_stringshare_del(group_data->name); - eina_list_free(group_data->used_in); - free(group_data); + request.resource_type = RESOURCE_TYPE_DATA; + request.name = group_data_name; + group_data = resource_remove(&group->data_items, &request); + resource_free(group_data); } void gm_group_data_rename(Project *pro, Group *group, Resource* group_data, const char *new_data_name) { - Eina_List *l; - assert(pro != NULL); assert(group != NULL); assert(group_data != NULL); assert(new_data_name != NULL); - l = eina_list_data_find_list(group->data_items, group_data); - - assert(l != NULL); - - group->data_items = eina_list_remove_list(group->data_items, l); + resource_remove(&group->data_items, group_data); eina_stringshare_del(group_data->name); group_data->name = eina_stringshare_add(new_data_name); - group->data_items = eina_list_sorted_insert(group->data_items, (Eina_Compare_Cb)resource_cmp, group_data); + resource_insert(&group->data_items, group_data); } /** diff --git a/src/bin/project_manager/project_manager.c b/src/bin/project_manager/project_manager.c index c54a0dc..51550a5 100644 --- a/src/bin/project_manager/project_manager.c +++ b/src/bin/project_manager/project_manager.c @@ -1026,15 +1026,14 @@ _image_resources_load(Project *project) PROGRESS_SEND(_("image processing (%d/%d): %s"), im_proc, im_total, image_name); - res = mem_calloc(1, sizeof(External_Resource)); - res->name = eina_stringshare_add(image_name); + res = (External_Resource *) resource_add(image_name, RESOURCE_TYPE_IMAGE); comp_type = edje_edit_image_compression_type_get(project->global_object, res->name); if (comp_type == EDJE_EDIT_IMAGE_COMP_USER) res->source = eina_stringshare_add(image_name); else res->source = eina_stringshare_printf("%s/%s", resource_folder, image_name); - project->images = eina_list_sorted_insert(project->images, (Eina_Compare_Cb) resource_cmp, res); + resource_insert(&project->images, (Resource *)res); if (!ecore_file_exists(res->source)) { @@ -1103,10 +1102,9 @@ _sound_resources_load(Project *project) PROGRESS_SEND(_("sound processing (%d/%d): %s"), snd_proc, snd_total, sound_file); - res = mem_calloc(1, sizeof(External_Resource)); - res->name = eina_stringshare_add(sound_name); + res = (External_Resource*)resource_add(sound_name, RESOURCE_TYPE_SOUND); res->source = eina_stringshare_printf("%s/%s", resource_folder, sound_file); - project->sounds = eina_list_sorted_insert(project->sounds, (Eina_Compare_Cb) resource_cmp, res); + resource_insert(&project->sounds, (Resource *)res); if (!ecore_file_exists(res->source)) { @@ -1171,10 +1169,9 @@ _font_resources_load(Project *project) PROGRESS_SEND(_("font processing (%d/%d): %s"), fnt_proc, fnt_total, font_file); - res = mem_calloc(1, sizeof(External_Resource)); - res->name = eina_stringshare_add(font_file); + res = (External_Resource *)resource_add(font_file, RESOURCE_TYPE_FONT); res->source = eina_stringshare_printf("%s/%s", resource_folder, font_file); - project->fonts = eina_list_sorted_insert(project->fonts, (Eina_Compare_Cb) resource_cmp, res); + resource_insert(&project->fonts, (Resource *)res); if (!ecore_file_exists(res->source)) { @@ -1219,10 +1216,9 @@ _tones_resources_load(Project *project) PROGRESS_SEND(_("tone processing (%d/%d): %s"), ++tones_proc, tones_total, name); - res = mem_calloc(1, sizeof(Tone_Resource)); - res->name = eina_stringshare_add(name); + res = (Tone_Resource *)resource_add(name, RESOURCE_TYPE_TONE); res->freq = edje_edit_sound_tone_frequency_get(project->global_object, name); - project->tones = eina_list_sorted_insert(project->tones, (Eina_Compare_Cb) resource_cmp, res); + resource_insert(&project->tones, (Resource *)res); } edje_edit_string_list_free(tones); @@ -1247,8 +1243,7 @@ _colorclasses_resources_load(Project *project) PROGRESS_SEND(_("colorclass processing (%d/%d): %s"), ++cc_proc, cc_total, name); - res = mem_calloc(1, sizeof(Colorclass_Resource)); - res->name = eina_stringshare_add(name); + res = (Colorclass_Resource *)resource_add(name, RESOURCE_TYPE_COLORCLASS); if (!edje_edit_color_class_colors_get(project->global_object, name, &res->color1.r, &res->color1.g, &res->color1.b, &res->color1.a, @@ -1256,10 +1251,10 @@ _colorclasses_resources_load(Project *project) &res->color3.r, &res->color3.g, &res->color3.b, &res->color3.a)) { eina_stringshare_del(res->name); - free(res); + resource_free((Resource *)res); } else - project->colorclasses = eina_list_sorted_insert(project->colorclasses, (Eina_Compare_Cb) resource_cmp, res); + resource_insert(&project->colorclasses, (Resource *)res); } edje_edit_string_list_free(colorclasses); @@ -1284,10 +1279,8 @@ _styles_resources_load(Project *project) PROGRESS_SEND(_("style processing (%d/%d): %s"), ++styles_proc, styles_total, name); - res = mem_calloc(1, sizeof(Resource)); - res->name = eina_stringshare_add(name); - - project->styles = eina_list_sorted_insert(project->styles, (Eina_Compare_Cb) resource_cmp, res); + res = resource_add(name, RESOURCE_TYPE_STYLE); + resource_insert(&project->styles, res); } edje_edit_string_list_free(styles); @@ -1405,7 +1398,7 @@ _group_source_code_export(void *data, Eina_Thread *thread __UNUSED__) ecore_file_mkdir(eina_strbuf_string_get(buf)); EINA_LIST_FOREACH(part->states, ls, state) { - resource = edje_edit_state_image_get(group->edit_object, part->name, state->parsed_name, state->parsed_val); + resource = edje_edit_state_image_get(group->edit_object, part->name, state->name, state->val); PROGRESS_SEND(_("Export image '%s'"), resource); _external_resource_export(worker.project->images, resource, eina_strbuf_string_get(buf)); eina_stringshare_del(resource); @@ -1419,7 +1412,7 @@ _group_source_code_export(void *data, Eina_Thread *thread __UNUSED__) ecore_file_mkdir(eina_strbuf_string_get(buf)); EINA_LIST_FOREACH(part->states, ls, state) { - resource = edje_edit_state_font_get(group->edit_object, part->name, state->parsed_name, state->parsed_val); + resource = edje_edit_state_font_get(group->edit_object, part->name, state->name, state->val); Eina_Stringshare *font_res = edje_edit_font_path_get(group->edit_object, resource); PROGRESS_SEND(_("Export font '%s'"), font_res); _external_resource_export(worker.project->fonts, font_res, eina_strbuf_string_get(buf)); diff --git a/src/bin/project_manager/resource_manager.c b/src/bin/project_manager/resource_manager.c index ee6f787..f049061 100644 --- a/src/bin/project_manager/resource_manager.c +++ b/src/bin/project_manager/resource_manager.c @@ -19,99 +19,245 @@ #include "resource_manager.h" -int -resource_cmp(Resource *res1, Resource *res2) +Resource * +resource_add(const char *name, Resource_Type type) { - return strcmp(res1->name, res2->name); -} + Resource *res = NULL; -void * -pm_resource_get(Eina_List *list, Eina_Stringshare *name) -{ - Resource res; - res.name = name; - return eina_list_search_sorted(list, (Eina_Compare_Cb)resource_cmp, &res); + assert(name != NULL); + + switch (type) + { + case RESOURCE_TYPE_NONE: + break; + case RESOURCE_TYPE_GROUP: + res = mem_calloc(1, sizeof(Group)); + break; + case RESOURCE_TYPE_PART: + res = mem_calloc(1, sizeof(Part)); + break; + case RESOURCE_TYPE_STATE: + res = mem_calloc(1, sizeof(State)); + break; + case RESOURCE_TYPE_PROGRAM: + res = mem_calloc(1, sizeof(Program)); + break; + case RESOURCE_TYPE_ITEM: + //res = mem_calloc(1, sizeof(Item)); + break; + case RESOURCE_TYPE_DATA: + res = mem_calloc(1, sizeof(Resource)); + break; + case RESOURCE_TYPE_IMAGE: + res = mem_calloc(1, sizeof(External_Resource)); + break; + case RESOURCE_TYPE_SOUND: + res = mem_calloc(1, sizeof(External_Resource)); + break; + case RESOURCE_TYPE_FONT: + res = mem_calloc(1, sizeof(External_Resource)); + break; + case RESOURCE_TYPE_TONE: + res = mem_calloc(1, sizeof(Tone_Resource)); + break; + case RESOURCE_TYPE_STYLE: + res = mem_calloc(1, sizeof(Resource)); + break; + case RESOURCE_TYPE_TAG: + res = mem_calloc(1, sizeof(Resource)); + break; + case RESOURCE_TYPE_COLORCLASS: + res = mem_calloc(1, sizeof(Colorclass_Resource)); + break; + } + assert(res != NULL); + + res->resource_type = type; + res->name = eina_stringshare_add(name); + + return res; } -void * -pm_resource_unsorted_get(Eina_List *list, Eina_Stringshare *name) +void +resource_free(Resource *res) { - Resource res; - res.name = name; - return eina_list_search_unsorted(list, (Eina_Compare_Cb)resource_cmp, &res); + assert(res != NULL); + + eina_stringshare_del(res->name); + free(res); } -Eina_Bool -pm_resource_usage_add(Eina_List *list, Eina_Stringshare *name, void *usage_data) +static int +resource_cmp(Resource *res1, Resource *res2) { - Resource *res = (Resource *) pm_resource_get(list, name); + int cmp; + + if (res1->resource_type != res2->resource_type) + return res1->resource_type - res2->resource_type; + + if (res1->resource_type == RESOURCE_TYPE_ITEM) + abort(); - if (!res) - return false; + /* stringshares */ + if (res1->name == res2->name) + cmp = 0; + else + cmp = strcmp(res1->name, res2->name); + + if (!cmp && (res1->resource_type == RESOURCE_TYPE_STATE)) + { + if (((State *)res1)->val > ((State *)res2)->val) + return 1; + if (((State *)res1)->val < ((State *)res2)->val) + return -1; + return 0; + } - res->used_in = eina_list_sorted_insert(res->used_in, (Eina_Compare_Cb)resource_cmp, usage_data); - return true; + return strcmp(res1->name, res2->name); } -Eina_Bool -pm_resource_usage_unsorted_add(Eina_List *list, Eina_Stringshare *name, void *usage_data) +Resource * +resource_get(const Eina_List *list, const Resource *request) { - Resource *res = (Resource *) pm_resource_unsorted_get(list, name); + Resource *ret = NULL; - if (!res) - return false; + assert(request != NULL); + assert(request->resource_type != RESOURCE_TYPE_NONE); - res->used_in = eina_list_sorted_insert(res->used_in, (Eina_Compare_Cb)resource_cmp, usage_data); - return true; + switch (request->resource_type) + { + case RESOURCE_TYPE_GROUP: + case RESOURCE_TYPE_STATE: + case RESOURCE_TYPE_PROGRAM: + case RESOURCE_TYPE_DATA: + case RESOURCE_TYPE_IMAGE: + case RESOURCE_TYPE_SOUND: + case RESOURCE_TYPE_FONT: + case RESOURCE_TYPE_TONE: + case RESOURCE_TYPE_STYLE: + case RESOURCE_TYPE_TAG: + case RESOURCE_TYPE_COLORCLASS: + case RESOURCE_TYPE_ITEM: + ret = eina_list_search_sorted(list, (Eina_Compare_Cb)resource_cmp, request); + break; + case RESOURCE_TYPE_PART: + ret = eina_list_search_unsorted(list, (Eina_Compare_Cb)resource_cmp, request); + break; + case RESOURCE_TYPE_NONE: + break; + } + return ret; } -Eina_List * -pm_resource_del(Eina_List *list, void *res) +void +resource_insert(Eina_List **list, const Resource *res) { + assert(list != NULL); assert(res != NULL); + assert(res->resource_type != RESOURCE_TYPE_NONE); + + switch (res->resource_type) + { + case RESOURCE_TYPE_GROUP: + case RESOURCE_TYPE_STATE: + case RESOURCE_TYPE_PROGRAM: + case RESOURCE_TYPE_DATA: + case RESOURCE_TYPE_IMAGE: + case RESOURCE_TYPE_SOUND: + case RESOURCE_TYPE_FONT: + case RESOURCE_TYPE_TONE: + case RESOURCE_TYPE_STYLE: + case RESOURCE_TYPE_TAG: + case RESOURCE_TYPE_COLORCLASS: + case RESOURCE_TYPE_ITEM: + *list = eina_list_sorted_insert(*list, (Eina_Compare_Cb)resource_cmp, res); + break; + case RESOURCE_TYPE_PART: + *list = eina_list_append(*list, res); + break; + case RESOURCE_TYPE_NONE: + break; + } +} + +Resource * +resource_remove(Eina_List **list, const Resource *res) +{ + Eina_List *l_del = NULL; + Resource *ret; + assert(list != NULL); - list = eina_list_remove(list, res); - return list; + assert(res != NULL); + assert(res->resource_type != RESOURCE_TYPE_NONE); + + switch (res->resource_type) + { + case RESOURCE_TYPE_GROUP: + case RESOURCE_TYPE_STATE: + case RESOURCE_TYPE_PROGRAM: + case RESOURCE_TYPE_DATA: + case RESOURCE_TYPE_IMAGE: + case RESOURCE_TYPE_SOUND: + case RESOURCE_TYPE_FONT: + case RESOURCE_TYPE_TONE: + case RESOURCE_TYPE_STYLE: + case RESOURCE_TYPE_TAG: + case RESOURCE_TYPE_COLORCLASS: + case RESOURCE_TYPE_ITEM: + l_del = eina_list_search_sorted_list(res->used_in, (Eina_Compare_Cb)resource_cmp, res); + break; + case RESOURCE_TYPE_PART: + l_del = eina_list_search_unsorted_list(res->used_in, (Eina_Compare_Cb)resource_cmp, res); + break; + case RESOURCE_TYPE_NONE: + break; + } + assert(l_del != NULL); + + ret = eina_list_data_get(l_del); + *list = eina_list_remove_list(*list, l_del); + return ret; } void -pm_resource_usage_del(Eina_List *list, Eina_Stringshare *name, void *usage_data) +resource_insert_after(Eina_List **list, const Resource *after, const Resource *res) { - Resource *res = (Resource *) pm_resource_get(list, name); - Eina_List *l_del; - + assert(list != NULL); assert(res != NULL); + assert(res->resource_type == RESOURCE_TYPE_PART); - l_del = eina_list_search_sorted_list(res->used_in, (Eina_Compare_Cb)resource_cmp, usage_data); + *list = eina_list_append_relative(*list, res, after); +} - TODO("remove this after fixing resource managment"); - if (!l_del) - { - ERR("Can't delete resource \"%s\"", name); - return; - } - assert(l_del); +void +resource_used_in_add(Resource *res, const Resource *used_in) +{ + assert(res != NULL); + assert(used_in != NULL); - res->used_in = eina_list_remove_list(res->used_in, l_del); + res->used_in = eina_list_sorted_insert(res->used_in, (Eina_Compare_Cb)resource_cmp, used_in); } void -pm_resource_usage_unsorted_del(Eina_List *list, Eina_Stringshare *name, void *usage_data) +resource_used_in_del(Resource *res, const Resource *used_in) { - Resource *res = (Resource *) pm_resource_unsorted_get(list, name); Eina_List *l_del; assert(res != NULL); + assert(used_in != NULL); - l_del = eina_list_search_sorted_list(res->used_in, (Eina_Compare_Cb)resource_cmp, usage_data); + l_del = eina_list_search_sorted_list(res->used_in, (Eina_Compare_Cb)resource_cmp, used_in); - TODO("remove this after fixing resource managment"); - if (!l_del) - { - ERR("Can't delete resource \"%s\"", name); - return; - } - assert(l_del); + assert(l_del != NULL); res->used_in = eina_list_remove_list(res->used_in, l_del); } + +Eina_Bool +resource_used_in_get(Resource *res, const Resource *used_in) +{ + assert(res != NULL); + assert(used_in != NULL); + + return !!eina_list_search_sorted(res->used_in, (Eina_Compare_Cb)resource_cmp, used_in); +} diff --git a/src/bin/project_manager/resource_manager.h b/src/bin/project_manager/resource_manager.h index 7e8eab0..0ee1c20 100644 --- a/src/bin/project_manager/resource_manager.h +++ b/src/bin/project_manager/resource_manager.h @@ -22,8 +22,27 @@ #include "eflete.h" +typedef enum +{ + RESOURCE_TYPE_NONE, + RESOURCE_TYPE_GROUP, + RESOURCE_TYPE_PART, + RESOURCE_TYPE_STATE, + RESOURCE_TYPE_PROGRAM, + RESOURCE_TYPE_ITEM, + RESOURCE_TYPE_DATA, + RESOURCE_TYPE_IMAGE, + RESOURCE_TYPE_SOUND, + RESOURCE_TYPE_TONE, + RESOURCE_TYPE_STYLE, + RESOURCE_TYPE_TAG, + RESOURCE_TYPE_COLORCLASS, + RESOURCE_TYPE_FONT, +} Resource_Type; + #define RESOURCE_COMMON \ Eina_Stringshare *name; \ + Resource_Type resource_type; \ Eina_List *used_in; \ /** @@ -73,8 +92,7 @@ struct _State { RESOURCE_COMMON; - Eina_Stringshare *parsed_name; /**< parsed state name */ - double parsed_val; /**< parsed state value */ + double val; /**< parsed state value */ Part *part; /**< pointer to part */ }; @@ -162,92 +180,31 @@ typedef struct _Tone_Resource Tone_Resource; */ typedef struct _External_Resource External_Resource; -int -resource_cmp(Resource *res1, Resource *res2); +Resource * +resource_add(const char *name, Resource_Type type); -/** - * Find resource in sorted list by its name. - * - * @param list Resources list - * @param name Name of the resource to be found - * - * @return pointer to resource or NULL if it was not found - * - * @ingroup ProjectManager. - */ -void * -pm_resource_get(Eina_List *list, Eina_Stringshare *name); +void +resource_free(Resource *res); -/** - * Find resource in not sorted list by its name. - * - * @param list Resources list - * @param name Name of the resource to be found - * - * @return pointer to resource or NULL if it was not found - * - * @ingroup ProjectManager. - */ -void * -pm_resource_unsorted_get(Eina_List *list, Eina_Stringshare *name); +Resource * +resource_get(const Eina_List *list, const Resource *request); -/** - * Add reference to resource with info where it is used (i.e. part for images) - * - * @param list Resources list - * @param name Name of the resource. Must be in the list. - * @param usage_data Place where resource is used - * - * @ingroup ProjectManager. - */ -Eina_Bool -pm_resource_usage_add(Eina_List *list, Eina_Stringshare *name, void *usage_data); +void +resource_insert(Eina_List **list, const Resource *res); -/** - * Add reference to resource with info where it is used (i.e. part for images) - * - * @param list Resources list - * @param name Name of the resource. Must be in the list. - * @param usage_data Place where resource is used - * - * @ingroup ProjectManager. - */ -Eina_Bool -pm_resource_usage_unsorted_add(Eina_List *list, Eina_Stringshare *name, void *usage_data); +void +resource_insert_after(Eina_List **list, const Resource *after, const Resource *res); -/** - * Remove resource. - * - * @param list Resources list - * @param res Resource structure - * - * @ingroup ProjectManager. - */ -Eina_List * -pm_resource_del(Eina_List *list, void *res); +Resource * +resource_remove(Eina_List **list, const Resource *res); -/** - * Remove reference to resource. - * - * @param list Resources list - * @param name Name of the resource. Must be in the list. - * @param usage_data Place where resource is used. Must be added to usage list. - * - * @ingroup ProjectManager. - */ void -pm_resource_usage_del(Eina_List *list, Eina_Stringshare *name, void *usage_data); +resource_used_in_add(Resource *res, const Resource *used_in); -/** - * Remove reference to resource. - * - * @param list Resources list - * @param name Name of the resource. Must be in the list. - * @param usage_data Place where resource is used. Must be added to usage list. - * - * @ingroup ProjectManager. - */ void -pm_resource_usage_unsorted_del(Eina_List *list, Eina_Stringshare *name, void *usage_data); +resource_used_in_del(Resource *res, const Resource *used_in); + +Eina_Bool +resource_used_in_get(Resource *res, const Resource *used_in); #endif /* RESOURCE_MANAGER_H */ diff --git a/src/bin/ui/colorclass_manager.c b/src/bin/ui/colorclass_manager.c index 08bf78e..146aecd 100644 --- a/src/bin/ui/colorclass_manager.c +++ b/src/bin/ui/colorclass_manager.c @@ -100,11 +100,8 @@ _colorclass_add_cb(void *data __UNUSED__, it = (Colorclass_Item *)mem_calloc(1, sizeof(Colorclass_Item)); it->name = elm_entry_entry_get(mng.entry); - res = mem_calloc(1, sizeof(Colorclass_Resource)); - res->name = eina_stringshare_add(it->name); - ap.project->colorclasses = eina_list_sorted_insert(ap.project->colorclasses, - (Eina_Compare_Cb) resource_cmp, - res); + res = (Colorclass_Resource *)resource_add(it->name, RESOURCE_TYPE_COLORCLASS); + resource_insert(&ap.project->colorclasses, (Resource *)res); edje_edit_color_class_add(ap.project->global_object, eina_stringshare_add(it->name)); glit_ccl = elm_genlist_item_append(mng.genlist, _itc_ccl, it, NULL, @@ -129,14 +126,18 @@ _colorclass_del_cb(void *data __UNUSED__, void *event_info __UNUSED__) { Resource *res; + Resource request; Elm_Object_Item *it = elm_genlist_selected_item_get(mng.genlist); Elm_Object_Item *next = elm_genlist_item_next_get(it); Colorclass_Item *ccl = elm_object_item_data_get(it); - res = pm_resource_get(ap.project->colorclasses, ccl->name); + request.resource_type = RESOURCE_TYPE_COLORCLASS; + request.name = ccl->name; + res = resource_get(ap.project->colorclasses, &request); edje_edit_color_class_del(ap.project->global_object, ccl->name); - ap.project->colorclasses = pm_resource_del(ap.project->colorclasses, res); + resource_remove(&ap.project->colorclasses, res); + resource_free(res); elm_object_item_del(it); #if 0 diff --git a/src/bin/ui/image_manager.c b/src/bin/ui/image_manager.c index 93ed69c..ae481c7 100644 --- a/src/bin/ui/image_manager.c +++ b/src/bin/ui/image_manager.c @@ -120,6 +120,7 @@ _grid_content_get(void *data, Evas_Object *image_obj = NULL; Evas_Object *grid = (Evas_Object *)obj; Resource *res; + Resource request; assert(it != NULL); assert(grid != NULL); @@ -134,7 +135,9 @@ _grid_content_get(void *data, else if (!strcmp(part, "elm.swallow.end")) { it->is_used = true; - res = (Resource *) pm_resource_get(ap.project->images, it->image_name); + request.name = it->image_name; + request.resource_type = RESOURCE_TYPE_IMAGE; + res = resource_get(ap.project->images, &request); if (eina_list_count(res->used_in) == 0) { image_obj = elm_icon_add(grid); @@ -285,21 +288,20 @@ _on_image_done(void *data __UNUSED__, } file_name = ecore_file_file_get(selected); - res = mem_calloc(1, sizeof(External_Resource)); - res->name = eina_stringshare_add(file_name); + res = (External_Resource *)resource_add(file_name, RESOURCE_TYPE_IMAGE); res->source = eina_stringshare_printf("%s/images/%s", ap.project->develop_path, file_name); if (!ecore_file_exists(res->source)) { ecore_file_cp(selected, res->source); - ap.project->images = eina_list_sorted_insert(ap.project->images, (Eina_Compare_Cb) resource_cmp, res); + resource_insert(&ap.project->images, (Resource *)res); } else { ERR(_("File exist")); free(image); - free(res); + resource_free((Resource *)res); continue; } edje_edit_image_add(ap.project->global_object, selected); @@ -348,6 +350,7 @@ _image_del_cb(void *data __UNUSED__, Image_Item *it = NULL; Eina_List *grid_list, *l, *l2; External_Resource *res; + Resource request; assert(mng.gengrid != NULL); @@ -358,14 +361,17 @@ _image_del_cb(void *data __UNUSED__, EINA_LIST_FOREACH_SAFE(grid_list, l, l2, grid_item) { it = elm_object_item_data_get(grid_item); - res = pm_resource_get(ap.project->images, it->image_name); + request.name = it->image_name; + request.resource_type = RESOURCE_TYPE_IMAGE; + res = (External_Resource *)resource_get(ap.project->images, &request); if (!res->used_in) { ecore_file_unlink(res->source); elm_object_item_del(grid_item); edje_edit_image_del(ap.project->global_object, it->image_name); - ap.project->images = pm_resource_del(ap.project->images, res); + resource_remove(&ap.project->images, (Resource *)res); + resource_free((Resource *)res); } else elm_gengrid_item_selected_set(grid_item, false); diff --git a/src/bin/ui/popup.c b/src/bin/ui/popup.c index 160a6c0..995789d 100644 --- a/src/bin/ui/popup.c +++ b/src/bin/ui/popup.c @@ -654,7 +654,7 @@ _grid_content_get(void *data, Item *it = data; Evas_Object *image_obj = NULL; Evas_Object *grid = (Evas_Object *)obj; - Resource *res; + Resource *res, request; assert(it != NULL); assert(grid != NULL); @@ -668,7 +668,9 @@ _grid_content_get(void *data, } else if (!strcmp(part, "elm.swallow.end")) { - res = (Resource *) pm_resource_get(ap.project->images, it->image_name); + request.resource_type = RESOURCE_TYPE_IMAGE; + request.name = it->image_name; + res = resource_get(ap.project->images, &request); if (eina_list_count(res->used_in) == 0) { image_obj = elm_icon_add(grid); diff --git a/src/bin/ui/property/property_group.c b/src/bin/ui/property/property_group.c index fd2d2e9..57e439a 100644 --- a/src/bin/ui/property/property_group.c +++ b/src/bin/ui/property/property_group.c @@ -204,8 +204,8 @@ TODO("remove NULL's after fixing genlist filters") #define PART_ARGS (group_pd.part) ? group_pd.part->name : NULL #define GROUP_DATA_ARGS (group_pd.group_data) ? group_pd.group_data->name : NULL #define ITEM_ARGS PART_ARGS, (group_pd.part) ? group_pd.part->current_item_name : NULL -#define STATE_ARGS PART_ARGS, (group_pd.part) ? group_pd.part->current_state->parsed_name : NULL, (group_pd.part) ? group_pd.part->current_state->parsed_val : 0 -#define STATE_SOURCE_ARGS str_val1, (group_pd.part) ? group_pd.part->current_state->parsed_name : NULL, (group_pd.part) ? group_pd.part->current_state->parsed_val : 0 +#define STATE_ARGS PART_ARGS, (group_pd.part) ? group_pd.part->current_state->name : NULL, (group_pd.part) ? group_pd.part->current_state->val : 0 +#define STATE_SOURCE_ARGS str_val1, (group_pd.part) ? group_pd.part->current_state->name : NULL, (group_pd.part) ? group_pd.part->current_state->val : 0 #define PROGRAM_ARGS (group_pd.program) ? group_pd.program->name : NULL #define CHANGE_MERGE group_pd.history.change, true, true #define CHANGE_NO_MERGE group_pd.history.change, false, true @@ -1090,6 +1090,7 @@ static void _part_states_combobox_fill(Evas_Object *combo, const char *part_name, const char *selected, Eina_Bool ignore_value) { Eina_List *l; + Resource request; Part *part; State *state; const char *state_name = NULL; @@ -1109,18 +1110,20 @@ _part_states_combobox_fill(Evas_Object *combo, const char *part_name, const char elm_object_disabled_set(combo, false); - part = pm_resource_unsorted_get(group_pd.group->parts, part_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(group_pd.group->parts, &request); if (ignore_value) { /* skipping states with same name but different value */ EINA_LIST_FOREACH(part->states, l, state) { - if (state_name && !strcmp(state_name, state->parsed_name)) + if (state_name && !strcmp(state_name, state->name)) continue; - ewe_combobox_item_add(combo, state->parsed_name); - state_name = state->parsed_name; + ewe_combobox_item_add(combo, state->name); + state_name = state->name; } } else diff --git a/src/bin/ui/sound_manager.c b/src/bin/ui/sound_manager.c index 9ec61a6..c876e67 100644 --- a/src/bin/ui/sound_manager.c +++ b/src/bin/ui/sound_manager.c @@ -130,16 +130,21 @@ _grid_sel_cb(void *data __UNUSED__, void *event_info) { External_Resource *res = NULL; + Resource request; Sound_Data *snd; snd = elm_object_item_data_get((Elm_Gengrid_Item *)event_info); switch (snd->type) { case SOUND_TYPE_SAMPLE: - res = pm_resource_get(ap.project->sounds, snd->name); + request.name = snd->name; + request.resource_type = RESOURCE_TYPE_SOUND; + res = (External_Resource *)resource_get(ap.project->sounds, &request); break; case SOUND_TYPE_TONE: - res = pm_resource_get(ap.project->tones, snd->name); + request.name = snd->name; + request.resource_type = RESOURCE_TYPE_TONE; + res = (External_Resource *)resource_get(ap.project->tones, &request); break; } @@ -240,20 +245,19 @@ _add_sample_done(void *data __UNUSED__, return false; } - res = mem_calloc(1, sizeof(External_Resource)); - res->name = eina_stringshare_add(file_name); + res = (External_Resource *)resource_add(file_name, RESOURCE_TYPE_SOUND); res->source = eina_stringshare_printf("%s/sounds/%s", ap.project->develop_path, file_name); if (!ecore_file_exists(res->source)) { ecore_file_cp(selected, res->source); - ap.project->sounds = eina_list_sorted_insert(ap.project->sounds, (Eina_Compare_Cb) resource_cmp, res); + resource_insert(&ap.project->sounds, (Resource *)res); } else { ERR(_("File '%s' exist"), res->name); - free(res); + resource_free((Resource *)res); return true; } @@ -285,10 +289,9 @@ _tone_add(void) frq = atoi(elm_entry_entry_get(mng.frq_entry)); edje_edit_sound_tone_add(ap.project->global_object, tone_name, frq); - tone = (Tone_Resource *)mem_calloc(1, sizeof(Tone_Resource)); - tone->name = eina_stringshare_add(tone_name); + tone = (Tone_Resource *)resource_add(tone_name, RESOURCE_TYPE_TONE); tone->freq = frq; - ap.project->tones = eina_list_sorted_insert(ap.project->tones, (Eina_Compare_Cb)resource_cmp, tone); + resource_insert(&ap.project->tones, (Resource *)tone); snd = (Sound_Data *)mem_malloc(sizeof(Sound_Data)); snd->name = eina_stringshare_ref(tone->name); @@ -395,6 +398,7 @@ _sound_del_cb(void *data __UNUSED__, Sound_Data *snd; Eina_List *list, *l, *l_next; External_Resource *res; + Resource request; list = (Eina_List *)elm_gengrid_selected_items_get(mng.gengrid); EINA_LIST_FOREACH_SAFE(list, l, l_next, grid_it) @@ -404,18 +408,22 @@ _sound_del_cb(void *data __UNUSED__, switch (snd->type) { case SOUND_TYPE_SAMPLE: - res = pm_resource_get(ap.project->sounds, snd->name); + request.name = snd->name; + request.resource_type = RESOURCE_TYPE_SOUND; + res = (External_Resource *)resource_get(ap.project->sounds, &request); if (res->used_in) ERR("Unable to delete sample '%s'", res->name); edje_edit_sound_sample_del(ap.project->global_object, snd->name); ecore_file_unlink(res->source); - ap.project->sounds = pm_resource_del(ap.project->sounds, res); + resource_remove(&ap.project->sounds, (Resource *)res); elm_object_item_del(grid_it); break; case SOUND_TYPE_TONE: - res = pm_resource_get(ap.project->tones, snd->name); + request.name = snd->name; + request.resource_type = RESOURCE_TYPE_SOUND; + res = (External_Resource *)resource_get(ap.project->tones, &request); if (res->used_in) ERR("Unable to delete tone '%s'", res->name); edje_edit_sound_tone_del(ap.project->global_object, snd->name); - ap.project->tones = pm_resource_del(ap.project->tones, res); + resource_remove(&ap.project->tones, (Resource *)res); elm_object_item_del(grid_it); break; } diff --git a/src/bin/ui/style_manager.c b/src/bin/ui/style_manager.c index ab15483..293c276 100644 --- a/src/bin/ui/style_manager.c +++ b/src/bin/ui/style_manager.c @@ -206,9 +206,8 @@ _style_add_cb(void *data __UNUSED__, elm_genlist_item_selected_set(glit, true); elm_genlist_item_bring_in(glit, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); - res = mem_calloc(1, sizeof(Resource)); - res->name = eina_stringshare_add(style_name); - ap.project->styles = eina_list_sorted_insert(ap.project->styles, (Eina_Compare_Cb)resource_cmp, res); + res = resource_add(style_name, RESOURCE_TYPE_STYLE); + resource_insert(&ap.project->styles, res); CRIT_ON_FAIL(editor_save(ap.project->global_object)); TODO("Remove this line once edje_edit API would be added into Editor Module and saving would work properly") @@ -249,9 +248,8 @@ _tab_add_cb(void *data __UNUSED__, tags = edje_edit_style_tags_list_get(ap.project->global_object, style_name); EINA_LIST_FOREACH(tags, l, buf) { - res = mem_calloc(1, sizeof(Resource)); - res->name = eina_stringshare_add(buf); - resources = eina_list_sorted_insert(resources, (Eina_Compare_Cb)resource_cmp, res); + res = resource_add(buf, RESOURCE_TYPE_TAG); + resource_insert(&resources, res); } edje_edit_string_list_free(tags); @@ -293,10 +291,7 @@ _tab_add_cb(void *data __UNUSED__, close: EINA_LIST_FREE(resources, res) - { - eina_stringshare_del(res->name); - free(res); - } + resource_free(res); evas_object_del(item); eina_stringshare_del(buf); } @@ -309,6 +304,7 @@ _btn_del_cb(void *data __UNUSED__, Evas_Object *edje_edit_obj = NULL; const char *style_name, *tag; Resource *res; + Resource request; Elm_Object_Item *glit = elm_genlist_selected_item_get(mng.genlist); if (!glit) return; @@ -318,9 +314,11 @@ _btn_del_cb(void *data __UNUSED__, if (!glit_parent) { style_name = elm_object_item_part_text_get(glit, "elm.text"); - res = pm_resource_get(ap.project->styles, style_name); + request.resource_type = RESOURCE_TYPE_STYLE; + request.name = style_name; + res = resource_get(ap.project->styles, &request); edje_edit_style_del(edje_edit_obj, style_name); - ap.project->styles = pm_resource_del(ap.project->styles, res); + resource_remove(&ap.project->styles, res); } else { diff --git a/src/bin/ui/tabs.c b/src/bin/ui/tabs.c index c961753..8f52aea 100644 --- a/src/bin/ui/tabs.c +++ b/src/bin/ui/tabs.c @@ -416,12 +416,15 @@ _part_renamed(void *data __UNUSED__, { Rename *ren = ei; Part *part; + Resource request; assert(tabs.current_group != NULL); assert(tabs.current_workspace != NULL); assert(ren != NULL); - part = pm_resource_unsorted_get(tabs.current_group->parts, ren->old_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = ren->old_name; + part = (Part *)resource_get(tabs.current_group->parts, &request); gm_part_rename(part, ren->new_name); workspace_group_navigator_update_part(tabs.current_workspace, part); } @@ -433,12 +436,15 @@ _group_data_renamed(void *data __UNUSED__, { Rename *ren = ei; Resource *group_data; + Resource request; assert(tabs.current_group != NULL); assert(tabs.current_workspace != NULL); assert(ren != NULL); - group_data = pm_resource_get(tabs.current_group->data_items, ren->old_name); + request.resource_type = RESOURCE_TYPE_DATA; + request.name = ren->old_name; + group_data = resource_get(tabs.current_group->data_items, &request); gm_group_data_rename(ap.project, tabs.current_group, group_data, ren->new_name); workspace_group_navigator_update_group_data(tabs.current_workspace, group_data); } diff --git a/src/bin/ui/workspace/group_navigator.c b/src/bin/ui/workspace/group_navigator.c index 612c54c..a5efb48 100644 --- a/src/bin/ui/workspace/group_navigator.c +++ b/src/bin/ui/workspace/group_navigator.c @@ -485,8 +485,8 @@ _on_activated(void *data, state = elm_object_item_data_get(glit); CRIT_ON_FAIL(editor_part_selected_state_set(pl->group->edit_object, NULL, false, true, state->part->name, - state->parsed_name, - state->parsed_val)); + state->name, + state->val)); } } @@ -1159,6 +1159,7 @@ _popup_add_state_ok_clicked(void *data, double val; Part *part; State *state_from; + Resource request; Eina_Stringshare *msg; Change *change; @@ -1181,13 +1182,16 @@ _popup_add_state_ok_clicked(void *data, } else { - state_from = pm_resource_get(part->states, item->title); + request.resource_type = RESOURCE_TYPE_STATE; + TODO("Check this"); + request.name = item->title; + state_from = (State *)resource_get(part->states, &request); msg = eina_stringshare_printf(_("added new state \"%s\" %.2f as copy of \"%s\" %.2f"), - name, val, state_from->parsed_name, state_from->parsed_val); + name, val, state_from->name, state_from->val); change = change_add(msg); CRIT_ON_FAIL(editor_state_copy(pl->group->edit_object, change, false, true, part->name, - state_from->parsed_name, state_from->parsed_val, + state_from->name, state_from->val, name, val)); } @@ -1843,12 +1847,12 @@ _state_del(Part_List *pl, assert(state != NULL); assert(strcmp(state->name, "default 0.00")); /* default state can't be deleted */ - msg = eina_stringshare_printf(_("deleted state \"%s\" %.2f"), state->parsed_name, state->parsed_val); + msg = eina_stringshare_printf(_("deleted state \"%s\" %.2f"), state->name, state->val); change = change_add(msg); eina_stringshare_del(msg); part_name = eina_stringshare_ref(state->part->name); - state_name = eina_stringshare_ref(state->parsed_name); - state_val = state->parsed_val; + state_name = eina_stringshare_ref(state->name); + state_val = state->val; TODO("recheck string args logic"); CRIT_ON_FAIL(editor_state_del(pl->group->edit_object, change, false, true, part_name, state_name, state_val)); eina_stringshare_del(part_name); @@ -2494,8 +2498,8 @@ group_navigator_state_next_request(Evas_Object *obj) CRIT_ON_FAIL(editor_part_selected_state_set(pl->group->edit_object, NULL, false, true, state->part->name, - state->parsed_name, - state->parsed_val)); + state->name, + state->val)); } } } diff --git a/src/bin/ui/workspace/groupview_calc.c b/src/bin/ui/workspace/groupview_calc.c index 1538787..5911240 100644 --- a/src/bin/ui/workspace/groupview_calc.c +++ b/src/bin/ui/workspace/groupview_calc.c @@ -534,12 +534,12 @@ _part_calc(Groupview_Smart_Data *sd, Groupview_Part *gp) x_align = edje_edit_state_text_align_x_get(sd->group->edit_object, gp->part->name, - gp->part->current_state->parsed_name, - gp->part->current_state->parsed_val); + gp->part->current_state->name, + gp->part->current_state->val); y_align = edje_edit_state_text_align_y_get(sd->group->edit_object, gp->part->name, - gp->part->current_state->parsed_name, - gp->part->current_state->parsed_val); + gp->part->current_state->name, + gp->part->current_state->val); evas_object_size_hint_align_set(gp->proxy_part, x_align, y_align); } } @@ -558,8 +558,8 @@ _part_update(Groupview_Smart_Data *sd, Groupview_Part *gp) case EDJE_PART_TYPE_TEXT: case EDJE_PART_TYPE_TEXTBLOCK: str = edje_edit_state_text_get(sd->group->edit_object, gp->part->name, - gp->part->current_state->parsed_name, - gp->part->current_state->parsed_val); + gp->part->current_state->name, + gp->part->current_state->val); if (!str) edje_object_part_text_set(sd->group->edit_object, gp->part->name, gp->part->name); eina_stringshare_del(str); diff --git a/src/bin/ui/workspace/workspace.c b/src/bin/ui/workspace/workspace.c index 98b888c..c23259a 100644 --- a/src/bin/ui/workspace/workspace.c +++ b/src/bin/ui/workspace/workspace.c @@ -943,20 +943,20 @@ _groupview_hl_part_drag_start(void *data, if (MIDDLE != event->hl_type) { part_w = edje_edit_state_max_w_get(wd->group->edit_object, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val); + event->part->current_state->name, + event->part->current_state->val); part_h = edje_edit_state_max_h_get(wd->group->edit_object, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val); + event->part->current_state->name, + event->part->current_state->val); } else { part_align_x = edje_edit_state_align_x_get(wd->group->edit_object, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val); + event->part->current_state->name, + event->part->current_state->val); part_align_y = edje_edit_state_align_y_get(wd->group->edit_object, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val); + event->part->current_state->name, + event->part->current_state->val); } } @@ -974,13 +974,13 @@ _groupview_hl_part_changed(void *data, { CRIT_ON_FAIL(editor_state_max_w_set(wd->group->edit_object, change, true, true, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val, + event->part->current_state->name, + event->part->current_state->val, event->w)); CRIT_ON_FAIL(editor_state_max_h_set(wd->group->edit_object, change, true, true, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val, + event->part->current_state->name, + event->part->current_state->val, event->h)); } else @@ -997,13 +997,12 @@ _groupview_hl_part_changed(void *data, if (align_y > 1.0) align_y = 1.0; CRIT_ON_FAIL(editor_state_align_x_set(wd->group->edit_object, change, true, true, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val, align_x)); + event->part->current_state->name, + event->part->current_state->val, align_x)); CRIT_ON_FAIL(editor_state_align_y_set(wd->group->edit_object, change, true, true, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val, align_y)); - + event->part->current_state->name, + event->part->current_state->val, align_y)); } } @@ -1031,11 +1030,11 @@ _groupview_hl_part_drag_stop(void *data, else { double align_x = edje_edit_state_align_x_get(wd->group->edit_object, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val); + event->part->current_state->name, + event->part->current_state->val); double align_y = edje_edit_state_align_y_get(wd->group->edit_object, event->part->name, - event->part->current_state->parsed_name, - event->part->current_state->parsed_val); + event->part->current_state->name, + event->part->current_state->val); if ((align_x == part_align_x) && (align_y == part_align_y)) change_free(change); else @@ -1330,10 +1329,13 @@ void workspace_part_del(Evas_Object *obj, Eina_Stringshare *part_name) { Part *part; + Resource request; WS_DATA_GET(obj); assert(part_name != NULL); - part = pm_resource_unsorted_get(wd->group->parts, part_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(wd->group->parts, &request); group_navigator_part_del(wd->group_navi, part); demo_group_part_del(wd->demo_navi, part); groupview_part_del(wd->normal.content, part); @@ -1346,11 +1348,14 @@ workspace_part_item_add(Evas_Object *obj, Eina_Stringshare *item_name) { Part *part; + Resource request; WS_DATA_GET(obj); assert(part_name != NULL); assert(item_name != NULL); - part = pm_resource_unsorted_get(wd->group->parts, part_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(wd->group->parts, &request); assert((part->type == EDJE_PART_TYPE_TABLE) || (part->type == EDJE_PART_TYPE_BOX)); @@ -1367,11 +1372,14 @@ workspace_part_item_del(Evas_Object *obj, Eina_Stringshare *item_name) { Part *part; + Resource request; WS_DATA_GET(obj); assert(part_name != NULL); assert(item_name != NULL); - part = pm_resource_unsorted_get(wd->group->parts, part_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(wd->group->parts, &request); assert((part->type == EDJE_PART_TYPE_TABLE) || (part->type == EDJE_PART_TYPE_BOX)); @@ -1387,12 +1395,15 @@ workspace_part_state_add(Evas_Object *obj, Eina_Stringshare *state_name) { Part *part; + Resource request; State *state; WS_DATA_GET(obj); assert(part_name != NULL); assert(state_name != NULL); - part = pm_resource_unsorted_get(wd->group->parts, part_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(wd->group->parts, &request); group_navigator_part_select(wd->group_navi, part); state = gm_state_add(ap.project, part, state_name); @@ -1405,13 +1416,18 @@ workspace_part_state_select(Evas_Object *obj, Eina_Stringshare *state_name) { Part *part; + Resource request; State *state; WS_DATA_GET(obj); assert(part_name != NULL); assert(state_name != NULL); - part = pm_resource_unsorted_get(wd->group->parts, part_name); - state = pm_resource_get(part->states, state_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(wd->group->parts, &request); + request.resource_type = RESOURCE_TYPE_STATE; + request.name = state_name; + state = (State *)resource_get(part->states, &request); groupview_hard_update(wd->normal.content); group_navigator_part_state_select(wd->group_navi, state); @@ -1423,13 +1439,18 @@ workspace_part_state_del(Evas_Object *obj, Eina_Stringshare *state_name) { Part *part; + Resource request; State *state; WS_DATA_GET(obj); assert(part_name != NULL); assert(state_name != NULL); - part = pm_resource_unsorted_get(wd->group->parts, part_name); - state = pm_resource_get(part->states, state_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(wd->group->parts, &request); + request.resource_type = RESOURCE_TYPE_STATE; + request.name = state_name; + state = (State *)resource_get(part->states, &request); group_navigator_part_select(wd->group_navi, part); group_navigator_part_state_del(wd->group_navi, part, state); @@ -1442,12 +1463,18 @@ workspace_part_restack(Evas_Object *obj, Eina_Stringshare *relative_part_name) { Part *part, *rel_part = NULL; + Resource request; WS_DATA_GET(obj); assert(part_name != NULL); - part = pm_resource_unsorted_get(wd->group->parts, part_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(wd->group->parts, &request); if (relative_part_name) - rel_part = pm_resource_unsorted_get(wd->group->parts, relative_part_name); + { + request.name = relative_part_name; + rel_part = (Part *)resource_get(wd->group->parts, &request); + } group_navigator_part_select(wd->group_navi, part); group_navigator_part_restack(wd->group_navi, part, rel_part); @@ -1463,10 +1490,13 @@ workspace_part_item_restack(Evas_Object *obj, Eina_Stringshare *relative_part_item_name) { Part *part; + Resource request; WS_DATA_GET(obj); assert(part_item_name != NULL); - part = pm_resource_unsorted_get(wd->group->parts, part_name); + request.resource_type = RESOURCE_TYPE_PART; + request.name = part_name; + part = (Part *)resource_get(wd->group->parts, &request); group_navigator_part_select(wd->group_navi, part); gm_part_item_restack(part, part_item_name, relative_part_item_name); --
