rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=58dd8b69507ea6b7f2c8cc4356cc35426fe59794
commit 58dd8b69507ea6b7f2c8cc4356cc35426fe59794 Author: Vitalii Vorobiov <vi.vorob...@samsung.com> Date: Tue Sep 20 15:37:36 2016 +0300 resource_manager_free: do not load and close group if it is already loaded @fix --- src/bin/resource_manager/resource_manager_free.c | 215 +++++++++++++++++------ 1 file changed, 164 insertions(+), 51 deletions(-) diff --git a/src/bin/resource_manager/resource_manager_free.c b/src/bin/resource_manager/resource_manager_free.c index e5df59e..f26fa99 100644 --- a/src/bin/resource_manager/resource_manager_free.c +++ b/src/bin/resource_manager/resource_manager_free.c @@ -21,8 +21,39 @@ #include "resource_manager_private.h" #include "project_manager.h" -/****** TOP BLOCK DELETION **********/ - +/***************************************************************************** + ***************************************************************************** + ********************** IMPORTANT ABOUT GROUP_LOAD/UNLOAD ******************** + ***************************************************************************** + ***************************************************************************** + ** in case if group is already loaded as tab, we dont need to ** + ** load that case again and then close, that's why it's ** + ** important to check if group is already loaded. In this case ** + ** ALWAYS use those API pair this way: ** + ***************************************************************************** + ** void ** + ** _something_del() ** + ** { ** + ** <stuff> ** + ** Eina_Bool is_opened = false; ** + ** <more stuff> ** + ** ... ** + ** if (!state->part->group->edit_object) ** + ** { ** + ** is_opened = true; ** + ** resource_group_edit_object_load(Project *, ** + ** Group *, ** + ** evas_object_evas_get(ap.win)); ** + ** } ** + ** ... ** + ** <work with dependecies and edje_edit> ** + ** ... ** + ** if (is_opened) ** + ** resource_group_edit_object_unload(Group *); ** + ** is_opened = false; ** + ** } ** + ***************************************************************************** + *****************************************************************************/ void _resource_image_free(Project *pro, Image2 *res) { @@ -44,6 +75,8 @@ _resource_image_del(Project *pro, Image2 *res_image) Image_Set2 *image_set; int idx; + Eina_Bool is_opened = false; + EINA_LIST_FOREACH(res_image->common.used_in, l, res) { if (res->common.type == RESOURCE2_TYPE_STATE) @@ -51,9 +84,13 @@ _resource_image_del(Project *pro, Image2 *res_image) state = (State2 *)res; if (res_image->common.name == state->normal) { - resource_group_edit_object_load(pro, - state->part->group, - evas_object_evas_get(ap.win)); + if (!state->part->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + state->part->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_state_image_set(state->part->group->edit_object, NULL, false, @@ -62,7 +99,8 @@ _resource_image_del(Project *pro, Image2 *res_image) state->common.name, state->val, EFLETE_DUMMY_IMAGE_NAME)); - resource_group_edit_object_unload(state->part->group); + if (is_opened) + resource_group_edit_object_unload(state->part->group); eina_stringshare_del(state->normal); state->normal = eina_stringshare_add(EFLETE_DUMMY_IMAGE_NAME); } @@ -116,21 +154,28 @@ _resource_tone_del(Project *pro, Tone2 *res_tone) Resource2 *res; Program2 *program; + Eina_Bool is_opened = false; + EINA_LIST_FOREACH(res_tone->common.used_in, l, res) { if (res->common.type == RESOURCE2_TYPE_PROGRAM) { program = (Program2 *)res; - resource_group_edit_object_load(pro, - program->group, - evas_object_evas_get(ap.win)); + if (!program->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + program->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_program_tone_name_set(program->group->edit_object, NULL, false, true, program->common.name, "")); - resource_group_edit_object_unload(program->group); + if (is_opened) + resource_group_edit_object_unload(program->group); } } @@ -156,21 +201,28 @@ _resource_sound_del(Project *pro, Sound2 *res_sound) Resource2 *res; Program2 *program; + Eina_Bool is_opened = false; + EINA_LIST_FOREACH(res_sound->common.used_in, l, res) { if (res->common.type == RESOURCE2_TYPE_PROGRAM) { program = (Program2 *)res; - resource_group_edit_object_load(pro, - program->group, - evas_object_evas_get(ap.win)); + if (!program->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + program->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_program_sample_name_set(program->group->edit_object, NULL, false, true, program->common.name, EFLETE_DUMMY_SAMPLE_NAME)); - resource_group_edit_object_unload(program->group); + if (is_opened) + resource_group_edit_object_unload(program->group); } } @@ -195,14 +247,20 @@ _resource_colorclass_del(Project *pro, Colorclass2 *res_colorclass) Resource2 *res; State2 *state; + Eina_Bool is_opened = false; + EINA_LIST_FOREACH(res_colorclass->common.used_in, l, res) { if (res->common.type == RESOURCE2_TYPE_STATE) { state = (State2 *)res; - resource_group_edit_object_load(pro, - state->part->group, - evas_object_evas_get(ap.win)); + if (!state->part->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + state->part->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_state_color_class_set(state->part->group->edit_object, NULL, false, @@ -211,7 +269,8 @@ _resource_colorclass_del(Project *pro, Colorclass2 *res_colorclass) state->common.name, state->val, NULL)); - resource_group_edit_object_unload(state->part->group); + if (is_opened) + resource_group_edit_object_unload(state->part->group); } } _resource_colorclass_free(pro, res_colorclass); @@ -255,14 +314,20 @@ _resource_style_del(Project *pro, Style2 *res_style) Resource2 *res; State2 *state; + Eina_Bool is_opened = false; + EINA_LIST_FOREACH(res_style->common.used_in, l, res) { if (res->common.type == RESOURCE2_TYPE_STATE) { state = (State2 *)res; - resource_group_edit_object_load(pro, - state->part->group, - evas_object_evas_get(ap.win)); + if (!state->part->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + state->part->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_state_text_style_set(state->part->group->edit_object, NULL, false, @@ -271,7 +336,8 @@ _resource_style_del(Project *pro, Style2 *res_style) state->common.name, state->val, NULL)); - resource_group_edit_object_unload(state->part->group); + if (is_opened) + resource_group_edit_object_unload(state->part->group); } } @@ -341,21 +407,28 @@ _resource_state_del(Project *pro, Part2 *part, State2 *state, Change *change) Resource2 *res; Program2 *program; + Eina_Bool is_opened = false; + EINA_LIST_FOREACH(state->common.used_in, l, res) { if (res->common.type == RESOURCE2_TYPE_PROGRAM) { program = (Program2 *)res; - resource_group_edit_object_load(pro, - program->group, - evas_object_evas_get(ap.win)); + if (!program->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + program->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_program_filter_state_set(program->group->edit_object, change, false, true, res->common.name, NULL)); - resource_group_edit_object_unload(program->group); + if (is_opened) + resource_group_edit_object_unload(program->group); } } _resource_state_free(part, state); @@ -412,14 +485,20 @@ _resource_part_del(Project *pro, Group2 *group, Part2 *part, Change *change) Part_Item2 *item; Program2 *program; + Eina_Bool is_opened = false; + EINA_LIST_FOREACH(part->common.used_in, l, res) { if (res->common.type == RESOURCE2_TYPE_STATE) { state = (State2 *)res; - resource_group_edit_object_load(pro, - state->part->group, - evas_object_evas_get(ap.win)); + if (!state->part->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + state->part->group, + evas_object_evas_get(ap.win)); + } if (state->part->type == EDJE_PART_TYPE_PROXY) CRIT_ON_FAIL(editor_state_proxy_source_set(state->part->group->edit_object, change, @@ -448,14 +527,21 @@ _resource_part_del(Project *pro, Group2 *group, Part2 *part, Change *change) state->val, NULL)); } - resource_group_edit_object_unload(state->part->group); + if (is_opened) + resource_group_edit_object_unload(state->part->group); + else + resource_group_edit_object_reload(pro, state->part->group); } else if (res->common.type == RESOURCE2_TYPE_PROGRAM) { program = (Program2 *)res; - resource_group_edit_object_load(pro, - program->group, - evas_object_evas_get(ap.win)); + if (!program->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + program->group, + evas_object_evas_get(ap.win)); + } /* if it is actually filter */ if (program->filter_part == part->common.name) { @@ -479,8 +565,10 @@ _resource_part_del(Project *pro, Group2 *group, Part2 *part, Change *change) part->common.name)); program->targets = eina_list_remove(program->targets, part); } - resource_group_edit_object_unload(program->group); + if (is_opened) + resource_group_edit_object_unload(program->group); } + is_opened = false; } /* kill all dependencies of part's states, @@ -523,6 +611,8 @@ _resource_program_del(Project *pro, Group2 *group, Program2 *program, Change *ch Resource2 *res; Program2 *res_program; + Eina_Bool is_opened = false; + EINA_LIST_FOREACH(program->common.used_in, l, res) { if (res->common.type == RESOURCE2_TYPE_PROGRAM) @@ -533,35 +623,46 @@ _resource_program_del(Project *pro, Group2 *group, Program2 *program, Change *ch while (eina_list_data_find_list(res_program->targets, program)) { /* if not its probably target part */ - resource_group_edit_object_load(pro, - program->group, - evas_object_evas_get(ap.win)); + if (!program->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + program->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_program_target_del(program->group->edit_object, change, false, true, res->common.name, program->common.name)); - resource_group_edit_object_unload(program->group); + if (is_opened) + resource_group_edit_object_unload(program->group); res_program->targets = eina_list_remove(res_program->targets, program); } /* if its inside of afters */ while (eina_list_data_find_list(res_program->afters, program)) { /* if not its probably target part */ - resource_group_edit_object_load(pro, - program->group, - evas_object_evas_get(ap.win)); + if (!program->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + program->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_program_after_del(program->group->edit_object, change, false, true, res->common.name, program->common.name)); - resource_group_edit_object_unload(program->group); + if (is_opened) + resource_group_edit_object_unload(program->group); res_program->afters = eina_list_remove(res_program->afters, program); } } + is_opened = false; } /* item is not used anywhere at all */ @@ -631,6 +732,8 @@ _resource_group_del(Project *pro, Group2 *group) Group_Data2 *data; Group2 *alias_group; + Eina_Bool is_opened = false; + /* IMPORTANT Since edje edit together with group deletion also delete all it's aliases it's important to update dependencies and recursively remove deps for @@ -645,10 +748,13 @@ _resource_group_del(Project *pro, Group2 *group) if (res->common.type == RESOURCE2_TYPE_PART) { part = (Part2 *)res; - resource_group_edit_object_load(pro, - part->group, - evas_object_evas_get(ap.win)); - + if (!part->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + part->group, + evas_object_evas_get(ap.win)); + } if (part->type == EDJE_PART_TYPE_GROUP) CRIT_ON_FAIL(editor_part_group_source_set(part->group->edit_object, NULL, @@ -665,14 +771,19 @@ _resource_group_del(Project *pro, Group2 *group) CRIT_ON_FAIL(editor_part_textblock_anchors_under_set( part->group->edit_object, NULL, false, true, part->common.name, NULL)); CRIT_ON_FAIL(editor_part_textblock_anchors_over_set( part->group->edit_object, NULL, false, true, part->common.name, NULL)); } - resource_group_edit_object_unload(part->group); + if (is_opened) + resource_group_edit_object_unload(part->group); } else if (res->common.type == RESOURCE2_TYPE_ITEM) { item = (Part_Item2 *)res; - resource_group_edit_object_load(pro, - item->part->group, - evas_object_evas_get(ap.win)); + if (!item->part->group->edit_object) + { + is_opened = true; + resource_group_edit_object_load(pro, + item->part->group, + evas_object_evas_get(ap.win)); + } CRIT_ON_FAIL(editor_part_item_source_set(item->part->group->edit_object, NULL, false, @@ -680,8 +791,10 @@ _resource_group_del(Project *pro, Group2 *group) item->part->common.name, item->common.name, EFLETE_INTERNAL_GROUP_NAME)); - resource_group_edit_object_unload(item->part->group); + if (is_opened) + resource_group_edit_object_unload(item->part->group); } + is_opened = false; } EINA_LIST_FOREACH(group->programs, l, program) --