rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=8d8769f400908830cc8f73964164f7623f5f1f0f
commit 8d8769f400908830cc8f73964164f7623f5f1f0f Author: Vitalii Vorobiov <vi.vorob...@samsung.com> Date: Mon Sep 12 19:12:53 2016 +0300 resource_manager2: forgotten AFTER and TARGETS del free and update --- src/bin/common/signals.h | 4 ++ src/bin/editor/editor_program.c | 9 ++-- src/bin/project_manager/project_manager.c | 6 +++ src/bin/resource_manager/resource_manager2.h | 1 + src/bin/resource_manager/resource_manager_build.c | 1 + src/bin/resource_manager/resource_manager_free.c | 62 ++++++++++++++++++++-- .../resource_manager/resource_manager_private.h | 2 +- src/bin/resource_manager/resource_manager_react.c | 16 +++--- 8 files changed, 84 insertions(+), 17 deletions(-) diff --git a/src/bin/common/signals.h b/src/bin/common/signals.h index 45290d3..0b81705 100644 --- a/src/bin/common/signals.h +++ b/src/bin/common/signals.h @@ -449,6 +449,10 @@ typedef struct { * * @ingroup Window */ +typedef struct { + const char *program_name; + Change *change; +} Editor_Program; #define SIGNAL_EDITOR_PROGRAM_DELETED "SIGNAL_EDITOR_PROGRAM_DELETED" /** diff --git a/src/bin/editor/editor_program.c b/src/bin/editor/editor_program.c index c22eafe..12266cf 100644 --- a/src/bin/editor/editor_program.c +++ b/src/bin/editor/editor_program.c @@ -901,12 +901,13 @@ _editor_program_del(Evas_Object *edit_object, Change *change, Eina_Bool merge __ const char *program_name) { Diff *diff; - Eina_Stringshare *event_info; + Editor_Program event_info; assert(edit_object != NULL); - event_info = eina_stringshare_add(program_name); - if (!_editor_signals_blocked) evas_object_smart_callback_call(ap.win, SIGNAL_EDITOR_PROGRAM_DELETED, (void *)event_info); + event_info.program_name = eina_stringshare_add(program_name); + event_info.change = change; + if (!_editor_signals_blocked) evas_object_smart_callback_call(ap.win, SIGNAL_EDITOR_PROGRAM_DELETED, (void *)&event_info); if (change) { @@ -928,10 +929,10 @@ _editor_program_del(Evas_Object *edit_object, Change *change, Eina_Bool merge __ if (apply) { CRIT_ON_FAIL(edje_edit_program_del(edit_object, program_name)); - eina_stringshare_del(event_info); CRIT_ON_FAIL(editor_save(edit_object)); _editor_project_changed(); } + eina_stringshare_del(event_info.program_name); return true; } diff --git a/src/bin/project_manager/project_manager.c b/src/bin/project_manager/project_manager.c index 2a02c73..691364b 100644 --- a/src/bin/project_manager/project_manager.c +++ b/src/bin/project_manager/project_manager.c @@ -28,6 +28,7 @@ #endif #include "change.h" +#include "resource_manager2.h" #define THREAD_CONTEXT_SWITCH_BEGIN ecore_thread_main_loop_begin() #define THREAD_CONTEXT_SWITCH_END ecore_thread_main_loop_end() @@ -320,6 +321,9 @@ _project_open_internal(Project_Thread *ptd) ftd->queue = 6; eina_lock_new(&ftd->mutex); ecore_thread_global_data_add("ptd", ptd, NULL, false); + + resource_manager_init(project); + /* Launch images load inside thread with feedback */ ecore_thread_feedback_run(_image_resources_feedback_job, _resources_export_feedback_cb, _resources_export_end_cb, _resources_export_cancel_cb, ftd, @@ -607,6 +611,8 @@ pm_project_close(Project *project) assert(project != NULL); + resource_manager_shutdown(project); + backup = eina_stringshare_printf("%s.backup", project->dev); ecore_file_remove(backup); eina_stringshare_del(backup); diff --git a/src/bin/resource_manager/resource_manager2.h b/src/bin/resource_manager/resource_manager2.h index 2bf1ab3..2701bd5 100644 --- a/src/bin/resource_manager/resource_manager2.h +++ b/src/bin/resource_manager/resource_manager2.h @@ -140,6 +140,7 @@ struct _Program2 Edje_Action_Type type; Eina_List *targets; Eina_List *afters; + Eina_Stringshare *filter_part; Group2 *group; }; diff --git a/src/bin/resource_manager/resource_manager_build.c b/src/bin/resource_manager/resource_manager_build.c index 0038c1a..e3d47f0 100644 --- a/src/bin/resource_manager/resource_manager_build.c +++ b/src/bin/resource_manager/resource_manager_build.c @@ -257,6 +257,7 @@ _program_dependency_load(Project *pro, Group2 *group, Program2 *program) res = resource_manager_find(group->parts, name); if (res) { + program->filter_part = eina_stringshare_add(name); _resource_usage_resource_add((Resource2 *)program, res); state = edje_edit_program_filter_state_get(group->edit_object, program->common.name); res_state = resource_manager_find(((Part2 *)res)->states, state); diff --git a/src/bin/resource_manager/resource_manager_free.c b/src/bin/resource_manager/resource_manager_free.c index a1ae67b..71796f5 100644 --- a/src/bin/resource_manager/resource_manager_free.c +++ b/src/bin/resource_manager/resource_manager_free.c @@ -405,12 +405,29 @@ _resource_part_del(Group2 *group, Part2 *part, Change *change) else if (res->common.type == RESOURCE2_TYPE_PROGRAM) { program = (Program2 *)res; - CRIT_ON_FAIL(editor_program_filter_part_set(program->group->edit_object, + /* if it is actually filter */ + if (program->filter_part == part->common.name) + { + CRIT_ON_FAIL(editor_program_filter_part_set(program->group->edit_object, + change, + false, + true, + res->common.name, + NULL)); + eina_stringshare_del(program->filter_part); + program->filter_part = NULL; + } + else + { + /* if not its probably target part */ + CRIT_ON_FAIL(editor_program_target_del(program->group->edit_object, change, false, true, res->common.name, - NULL)); + part->common.name)); + program->targets = eina_list_remove(program->targets, part); + } } } @@ -448,8 +465,45 @@ _resource_program_free(Group2 *group, Program2 *program) } void -_resource_program_del(Group2 *group, Program2 *program) +_resource_program_del(Group2 *group, Program2 *program, Change *change) { + Eina_List *l; + Resource2 *res; + Program2 *res_program; + + EINA_LIST_FOREACH(program->common.used_in, l, res) + { + if (res->common.type == RESOURCE2_TYPE_PROGRAM) + { + res_program = (Program2 *)res; + + /* if its inside of targets */ + while (eina_list_data_find_list(res_program->targets, program)) + { + /* if not its probably target part */ + CRIT_ON_FAIL(editor_program_target_del(program->group->edit_object, + change, + false, + true, + res->common.name, + program->common.name)); + 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 */ + CRIT_ON_FAIL(editor_program_after_del(program->group->edit_object, + change, + false, + true, + res->common.name, + program->common.name)); + res_program->afters = eina_list_remove(res_program->afters, program); + } + } + } + /* item is not used anywhere at all */ _resource_program_free(group, program); } @@ -564,7 +618,7 @@ _resource_group_del(Project *pro, Group2 *group) EINA_LIST_FOREACH(group->programs, l, program) { - _resource_program_del(group, program); + _resource_program_del(group, program, NULL); } EINA_LIST_FOREACH(group->data_items, l, data) { diff --git a/src/bin/resource_manager/resource_manager_private.h b/src/bin/resource_manager/resource_manager_private.h index fc7305d..e30d9ab 100644 --- a/src/bin/resource_manager/resource_manager_private.h +++ b/src/bin/resource_manager/resource_manager_private.h @@ -149,7 +149,7 @@ void _resource_program_free(Group2 *group, Program2 *program); void -_resource_program_del(Group2 *group, Program2 *program); +_resource_program_del(Group2 *group, Program2 *program, Change *change); void _resource_group_data_free(Group2 *group, Group_Data2 *data); diff --git a/src/bin/resource_manager/resource_manager_react.c b/src/bin/resource_manager/resource_manager_react.c index ed825ce..28c4784 100644 --- a/src/bin/resource_manager/resource_manager_react.c +++ b/src/bin/resource_manager/resource_manager_react.c @@ -90,7 +90,6 @@ _property_attribute_changed(void *data, *********************************************************************** ***********************************************************************/ Resource2 *part, *state, *source, *old_source, *item, *program; - Eina_Stringshare *tmp_value; Editor_Attribute_Change *change = (Editor_Attribute_Change *)event_info; Attribute editor_resource = (int)change->attribute; @@ -354,10 +353,7 @@ _property_attribute_changed(void *data, break; case RM_ATTRIBUTE_PROGRAM_FILTER_STATE: program = resource_manager_find(group->programs, change->program_name); - - tmp_value = edje_edit_program_filter_part_get(group->edit_object, change->program_name); - part = resource_manager_find(group->parts, tmp_value); - edje_edit_string_free(tmp_value); + part = resource_manager_find(group->parts, ((Program2 *)program)->filter_part); if (change->old_value) { @@ -378,12 +374,15 @@ _property_attribute_changed(void *data, { old_source = resource_manager_find(group->parts, change->old_value); _resource_usage_resource_del(program, old_source); + eina_stringshare_del(((Program2 *)program)->filter_part); + ((Program2 *)program)->filter_part = NULL; } if (change->value) { source = resource_manager_find(group->parts, change->value); _resource_usage_resource_add(program, source); + ((Program2 *)program)->filter_part = eina_stringshare_add(change->value); } break; case RM_ATTRIBUTE_STATE_PROXY_SOURCE: @@ -684,12 +683,13 @@ _editor_program_deleted_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info) { - Eina_Stringshare *program_name = event_info; + const Editor_Program *editor_part = event_info; Project *pro = (Project *)data; Group2 *group = _get_current_group2(pro); - Program2 *program = (Program2 *)resource_manager_find(group->programs, program_name); + Program2 *program = (Program2 *)resource_manager_find(group->programs, + editor_part->program_name); - _resource_program_del(group, program); + _resource_program_del(group, program, editor_part->change); } static void --