From e283598b19dbc55b96c0f6a5ec22aaedd7533bc1 Mon Sep 17 00:00:00 2001 From: Jaehwan Kim Date: Sat, 18 Feb 2012 14:41:27 +0900 Subject: [PATCH] elementary - modified item_del_pre_hook function prototype. 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 | 10 ++++++---- src/lib/elc_naviframe.c | 35 ++++++++++++++++++++++++++++++++++- src/lib/elm_diskselector.c | 7 ++++--- src/lib/elm_flipselector.c | 12 +++++++----- src/lib/elm_index.c | 7 ++++--- src/lib/elm_slideshow.c | 9 ++++++--- src/lib/elm_toolbar.c | 9 ++++++--- src/lib/elm_widget.c | 9 +++++---- src/lib/elm_widget.h | 2 +- 9 files changed, 73 insertions(+), 27 deletions(-) diff --git a/src/lib/elc_ctxpopup.c b/src/lib/elc_ctxpopup.c index df4876a..e554402 100644 --- a/src/lib/elc_ctxpopup.c +++ b/src/lib/elc_ctxpopup.c @@ -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 * diff --git a/src/lib/elc_naviframe.c b/src/lib/elc_naviframe.c index c134cf6..633bc26 100644 --- a/src/lib/elc_naviframe.c +++ b/src/lib/elc_naviframe.c @@ -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 diff --git a/src/lib/elm_diskselector.c b/src/lib/elm_diskselector.c index cbfcd43..bd5ce8c 100644 --- a/src/lib/elm_diskselector.c +++ b/src/lib/elm_diskselector.c @@ -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 * diff --git a/src/lib/elm_flipselector.c b/src/lib/elm_flipselector.c index 72702a7..e3fcba6 100644 --- a/src/lib/elm_flipselector.c +++ b/src/lib/elm_flipselector.c @@ -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 * diff --git a/src/lib/elm_index.c b/src/lib/elm_index.c index 0ac7e7c..dc771c4 100644 --- a/src/lib/elm_index.c +++ b/src/lib/elm_index.c @@ -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 * diff --git a/src/lib/elm_slideshow.c b/src/lib/elm_slideshow.c index 9871282..bc241b1 100644 --- a/src/lib/elm_slideshow.c +++ b/src/lib/elm_slideshow.c @@ -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 * diff --git a/src/lib/elm_toolbar.c b/src/lib/elm_toolbar.c index 7de897b..5cac094 100644 --- a/src/lib/elm_toolbar.c +++ b/src/lib/elm_toolbar.c @@ -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 * diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c index cde7778..d45ab97 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -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); + } } /** diff --git a/src/lib/elm_widget.h b/src/lib/elm_widget.h index 9921d4d..24ade60 100644 --- a/src/lib/elm_widget.h +++ b/src/lib/elm_widget.h @@ -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 -- 2.7.4