rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=5a36b7d805afeab38bb9e0205217aa063bab249c
commit 5a36b7d805afeab38bb9e0205217aa063bab249c Author: Vyacheslav Reutskiy <v.reuts...@samsung.com> Date: Fri May 5 13:51:03 2017 +0300 project_manager: fix crash on folder del Actually, previous implementation was based on genlist search genlist item, but it does not work for collapced tree items. Now on remove folder check the all groups by prefix, what saved in item, as example elm\ bubble\ base\ default top_left\ default If try to remove folder 'bubble' will be delete all groups which have prefix 'elm\bubble'. Except groups opened for edit. Fixes T5457 @fix --- src/bin/ui/project_navigator.c | 121 +++++++++++++++++++++++++++-------------- 1 file changed, 79 insertions(+), 42 deletions(-) diff --git a/src/bin/ui/project_navigator.c b/src/bin/ui/project_navigator.c index 18dfeec..c268efc 100644 --- a/src/bin/ui/project_navigator.c +++ b/src/bin/ui/project_navigator.c @@ -576,52 +576,90 @@ _folder_check(const char *prefix, Eina_Bool del) } static void -_folder_del(Elm_Object_Item *item) +_editor_group_del(const char *name, Eina_Bool event_call) { - Elm_Object_Item *itm, *parent; + Eina_Stringshare *tmp = eina_stringshare_add(name); + + if (!editor_group_del(ap.project->global_object, tmp, event_call)) + { + Eina_Stringshare *msg = eina_stringshare_printf(_("Can't remove layout \"%s\""), name); + popup_add(_("Error"), msg, BTN_OK, NULL, NULL); + eina_stringshare_del(msg); + } + eina_stringshare_del(tmp); +} + +static Eina_Bool +_folder_del_recursively(Elm_Object_Item *item, const char *folder) +{ + Eina_Stringshare *prefix; + Eina_List *folders = NULL, *groups = NULL, *l; const Eina_List *items; - Eina_List *l; - Eina_Stringshare *tmp, *msg; + Elm_Object_Item *itm; Group2 *group; const Elm_Genlist_Item_Class *itc; + Eina_Bool ret = true, rett; - items = elm_genlist_item_subitems_get(item); - EINA_LIST_FOREACH((Eina_List *)items, l, itm) + widget_tree_items_get(ap.project->RM.groups, folder, &folders, &groups); + if ((item) && elm_genlist_item_expanded_get(item)) { - itc = elm_genlist_item_item_class_get(itm); - if (itc == project_navigator.itc_folder) + items = elm_genlist_item_subitems_get(item); + EINA_LIST_FOREACH((Eina_List *)items, l, itm) { - // recursion for del folder - _folder_del(itm); - } - else if (itc == project_navigator.itc_group) - { - group = elm_object_item_data_get(itm); - tmp = eina_stringshare_add(group->common.name); - if (!editor_group_del(ap.project->global_object, tmp, false)) + itc = elm_genlist_item_item_class_get(itm); + if (itc == project_navigator.itc_folder) { - msg = eina_stringshare_printf(_("Can't delete layout \"%s\". " - "Please close a tab with given group."), - group->common.name); - TODO("Check if it's correct to ignore error"); - popup_add(_("Error"), msg, BTN_OK, NULL, NULL); - eina_stringshare_del(msg); + prefix = elm_object_item_data_get(itm); + rett = _folder_del_recursively(itm, prefix); + ret = ret ? rett : ret; + if (rett) elm_object_item_del(itm); } - eina_stringshare_del(tmp); } - elm_object_item_del(itm); } + else + { + EINA_LIST_FREE(folders, prefix) + { + rett = _folder_del_recursively(NULL, prefix); + ret = ret ? rett : ret; + } + } + EINA_LIST_FREE(groups, group) + { + if (group->edit_object) + { + popup_add(_("Warning: Delete layout"), + _("Can't delete the opened layout. Please, " + "close the layout tab before delete it."), + BTN_CANCEL, NULL, NULL); + ret = false; + } + else + _editor_group_del(group->common.name, true); + } + return ret; +} - parent = elm_genlist_item_parent_get(item); - elm_object_item_del(item); - while ((parent != project_navigator.item_top) && - (elm_genlist_item_subitems_count(parent) == 0 )) +static void +_folder_del(Elm_Object_Item *item) +{ + Elm_Object_Item *parent; + Eina_Stringshare *folder; + + folder = elm_object_item_data_get(item); + + if (_folder_del_recursively(item, folder)) { - item = parent; parent = elm_genlist_item_parent_get(item); elm_object_item_del(item); + while ((parent != project_navigator.item_top) && + (elm_genlist_item_subitems_count(parent) == 0 )) + { + item = parent; + parent = elm_genlist_item_parent_get(item); + elm_object_item_del(item); + } } - } static void @@ -632,11 +670,15 @@ _group_del(void *data __UNUSED__, Eina_Stringshare *group_name; Elm_Object_Item *item, *parent; Group2 *group; - - group_name = (Eina_Stringshare *)event_info; + const Elm_Genlist_Item_Class *itc; item = elm_genlist_selected_item_get(project_navigator.genlist); + itc = elm_genlist_item_item_class_get(item); + if (itc != project_navigator.itc_group) return; + + group_name = (Eina_Stringshare *)event_info; group = elm_object_item_data_get(item); + if ((group->common.name == group_name) || !strcmp(group->common.name, group_name)) { parent = elm_genlist_item_parent_get(item); @@ -676,22 +718,17 @@ _group_del_popup_close_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info) { - Eina_Stringshare *tmp, *msg; Group2 *group = data; Popup_Button btn_res = (Popup_Button) event_info; if (BTN_CANCEL == btn_res) return; - tmp = eina_stringshare_add(group->common.name); - - if (!editor_group_del(ap.project->global_object, tmp, true)) - { - msg = eina_stringshare_printf(_("Can't delete layout \"%s\""), group->common.name); - TODO("Check if it's correct to ignore error"); - popup_add(_("Error"), msg, BTN_OK, NULL, NULL); - eina_stringshare_del(msg); - } + _editor_group_del(group->common.name, true); elm_object_disabled_set(project_navigator.btn_del, true); + + Elm_Object_Item *item; + item = elm_genlist_selected_item_get(project_navigator.genlist); + elm_object_item_del(item); } static void --