elementary - modified item_del_pre_hook function prototype.
authorJaehwan Kim <jae.hwan.kim@samsung.com>
Sat, 18 Feb 2012 05:41:27 +0000 (14:41 +0900)
committerJaehwan Kim <jae.hwan.kim@samsung.com>
Sat, 18 Feb 2012 05:41:27 +0000 (14:41 +0900)
Now it returns the bool value to free the widget item.

Some widget items(i,e genlist) should not be deleted directly when elm_object_item_del is called.
So, if the pre_hook function returns EINA_FALSE, then the widget item will not be deleted.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@67565 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

Conflicts:

src/lib/elc_naviframe.c

src/lib/elc_ctxpopup.c
src/lib/elc_naviframe.c
src/lib/elm_diskselector.c
src/lib/elm_flipselector.c
src/lib/elm_index.c
src/lib/elm_slideshow.c
src/lib/elm_toolbar.c
src/lib/elm_widget.c
src/lib/elm_widget.h

index df4876a..e554402 100644 (file)
@@ -1308,16 +1308,16 @@ _remove_items(Widget_Data *wd)
    wd->items = NULL;
 }
 
-static void
+static Eina_Bool
 _item_del_pre_hook(Elm_Object_Item *it)
 {
-   ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
 
    Widget_Data *wd;
    Elm_Ctxpopup_Item *ctxpopup_it = (Elm_Ctxpopup_Item *) it;
 
    wd = elm_widget_data_get(WIDGET(ctxpopup_it));
-   if (!wd) return;
+   if (!wd) return EINA_FALSE;
 
    if (ctxpopup_it->icon)
      evas_object_del(ctxpopup_it->icon);
@@ -1333,11 +1333,13 @@ _item_del_pre_hook(Elm_Object_Item *it)
    if (eina_list_count(wd->items) < 1)
      {
         evas_object_hide(WIDGET(ctxpopup_it));
-        return;
+        return EINA_TRUE;
      }
 
    if (wd->visible)
      _sizing_eval(WIDGET(ctxpopup_it));
+
+   return EINA_TRUE;
 }
 
 EAPI Evas_Object *
index c134cf6..633bc26 100644 (file)
@@ -131,6 +131,7 @@ static Evas_Object * _title_icon_unset(Elm_Naviframe_Item *it);
 static Evas_Object * _title_content_unset(Elm_Naviframe_Item *it,
                                           const char *part);
 static void _item_del(Elm_Naviframe_Item *it);
+static Eina_Bool _item_del_pre_hook(Elm_Object_Item *it);
 static void _pushed_finished(void *data,
                              Evas_Object *obj,
                              const char *emission,
@@ -868,8 +869,40 @@ _item_del(Elm_Naviframe_Item *it)
      }
 
    eina_stringshare_del(it->style);
+}
+
+static Eina_Bool
+_item_del_pre_hook(Elm_Object_Item *it)
+{
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+   Elm_Naviframe_Item *navi_it;
+   Widget_Data *wd;
+
+   navi_it =(Elm_Naviframe_Item *) it;
+   wd = elm_widget_data_get(WIDGET(navi_it));
+   if (!wd) return EINA_FALSE;
+
+   if (it == elm_naviframe_top_item_get(WIDGET(navi_it)))
+     {
+        wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
+        _item_del(navi_it);
+        elm_widget_item_free(navi_it);
+        //If the item is only one, the stack will be empty
+        if (!wd->stack) return EINA_TRUE;
+        navi_it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
+                                            Elm_Naviframe_Item);
+        evas_object_show(VIEW(navi_it));
+        evas_object_raise(VIEW(navi_it));
+        elm_object_signal_emit(VIEW(navi_it), "elm,state,visible", "elm");
+     }
+   else
+     {
+        wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
+        _item_del(navi_it);
+        elm_widget_item_free(navi_it);
+     }
 
-   elm_widget_item_del(it);
+   return EINA_TRUE;
 }
 
 static void
index cbfcd43..bd5ce8c 100644 (file)
@@ -226,17 +226,17 @@ _check_string(void *data)
    return EINA_FALSE;
 }
 
-static void
+static Eina_Bool
 _item_del_pre_hook(Elm_Object_Item *it)
 {
-   ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
    Elm_Diskselector_Item *item, *item2, *dit;
    Eina_List *l;
    int i = 0;
    Widget_Data *wd;
    item = (Elm_Diskselector_Item *) it;
    wd = elm_widget_data_get(WIDGET(item));
-   if (!wd) return;
+   if (!wd) return EINA_FALSE;
 
    elm_box_unpack(wd->main_box, VIEW(item));
 
@@ -327,6 +327,7 @@ _item_del_pre_hook(Elm_Object_Item *it)
    wd->check_idler = ecore_idle_enterer_before_add(_check_string, wd);
    _sizing_eval(wd->self);
 
+   return EINA_TRUE;
 }
 
 static Elm_Diskselector_Item *
index 72702a7..e3fcba6 100644 (file)
@@ -57,7 +57,7 @@ static void _update_view(Evas_Object *obj);
 static void _callbacks_set(Evas_Object *obj);
 static void _flip_up(Widget_Data *wd);
 static void _flip_down(Widget_Data *wd);
-static void _item_del_pre_hook(Elm_Object_Item *it);
+static Eina_Bool _item_del_pre_hook(Elm_Object_Item *it);
 
 static const char SIG_SELECTED[] = "selected";
 static const char SIG_UNDERFLOWED[] = "underflowed";
@@ -576,22 +576,22 @@ _callbacks_set(Evas_Object *obj)
                                    "", _signal_val_change_stop, obj);
 }
 
-static void
+static Eina_Bool
 _item_del_pre_hook(Elm_Object_Item *it)
 {
-   ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
    Widget_Data *wd;
    Elm_Flipselector_Item *item, *item2;
    Eina_List *l;
 
    item = (Elm_Flipselector_Item *) it;
    wd = elm_widget_data_get(WIDGET(item));
-   if (!wd) return;
+   if (!wd) return EINA_FALSE;
 
    if (wd->walking > 0)
      {
         item->deleted = EINA_TRUE;
-        return;
+        return EINA_FALSE;
      }
 
    _flipselector_walk(wd);
@@ -619,6 +619,8 @@ _item_del_pre_hook(Elm_Object_Item *it)
    eina_stringshare_del(item->label);
    _sentinel_eval(wd);
    _flipselector_unwalk(wd);
+
+   return EINA_TRUE;
 }
 
 EAPI Evas_Object *
index 0ac7e7c..dc771c4 100644 (file)
@@ -227,14 +227,15 @@ _sizing_eval(Evas_Object *obj)
    evas_object_size_hint_max_set(obj, maxw, maxh);
 }
 
-static void
+static Eina_Bool
 _item_del_pre_hook(Elm_Object_Item *it)
 {
-   ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
    Widget_Data *wd = elm_widget_data_get(WIDGET(it));
-   if (!wd) return;
+   if (!wd) return EINA_FALSE;
    _item_free((Elm_Index_Item *) it);
    _index_box_clear(WIDGET(it), wd->bx[wd->level], wd->level);
+   return EINA_TRUE;
 }
 
 static Elm_Index_Item *
index 9871282..bc241b1 100644 (file)
@@ -349,14 +349,15 @@ _timer_cb(void *data)
    return ECORE_CALLBACK_CANCEL;
 }
 
-static void
+static Eina_Bool
 _item_del_pre_hook(Elm_Object_Item *it)
 {
-   ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
 
    Elm_Slideshow_Item *item = (Elm_Slideshow_Item *) it;
    Widget_Data *wd = elm_widget_data_get(WIDGET(item));
-   if (!wd) return;
+   if (!wd) return EINA_FALSE;
+
    if (wd->previous == item) wd->previous = NULL;
    if (wd->current == item)
      {
@@ -379,6 +380,8 @@ _item_del_pre_hook(Elm_Object_Item *it)
 
    if ((VIEW(item)) && (item->itc->func.del))
      item->itc->func.del(elm_widget_item_data_get(item), VIEW(item));
+
+   return EINA_TRUE;
 }
 
 EAPI Evas_Object *
index 7de897b..5cac094 100644 (file)
@@ -764,10 +764,10 @@ _access_state_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Elm_Widget_
    return NULL;
 }
 
-static void
+static Eina_Bool
 _item_del_pre_hook(Elm_Object_Item *it)
 {
-   ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
+   ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
 
    Widget_Data *wd;
    Evas_Object *obj2;
@@ -775,7 +775,8 @@ _item_del_pre_hook(Elm_Object_Item *it)
    item = (Elm_Toolbar_Item *) it;
 
    wd = elm_widget_data_get(WIDGET(item));
-   if (!wd) return;
+   if (!wd) return EINA_FALSE;
+
    obj2 = WIDGET(item);
    next = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(item)->next);
    wd->items = eina_inlist_remove(wd->items, EINA_INLIST_GET(item));
@@ -784,6 +785,8 @@ _item_del_pre_hook(Elm_Object_Item *it)
    if (wd->always_select && item->selected && next) _item_select(next);
    _item_del(item);
    _theme_hook(obj2);
+
+   return EINA_TRUE;
 }
 
 static Elm_Toolbar_Item *
index cde7778..d45ab97 100644 (file)
@@ -2850,11 +2850,12 @@ _elm_widget_item_del(Elm_Widget_Item *item)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
 
-   //Widget delete callback
+   //Widget item delete callback
    if (item->del_pre_func)
-     item->del_pre_func((Elm_Object_Item *) item);
-
-   _elm_widget_item_free(item);
+     {
+        if (item->del_pre_func((Elm_Object_Item *) item))
+          _elm_widget_item_free(item);
+     }
 }
 
 /**
index 9921d4d..24ade60 100644 (file)
@@ -207,7 +207,7 @@ typedef Evas_Object          *(*Elm_Widget_Content_Get_Cb)(const void *data, con
 typedef Evas_Object          *(*Elm_Widget_Content_Unset_Cb)(const void *data, const char *part);
 typedef void                  (*Elm_Widget_Signal_Emit_Cb)(void *data, const char *emission, const char *source);
 typedef void                  (*Elm_Widget_Disable_Cb)(void *data);
-typedef void                  (*Elm_Widget_Del_Pre_Cb)(void *data);
+typedef Eina_Bool             (*Elm_Widget_Del_Pre_Cb)(void *data);
 
 #define ELM_ACCESS_TYPE    0    // when reading out widget or item this is read first
 #define ELM_ACCESS_INFO    1    // next read is info - this is normally label