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

-- 


Reply via email to