From 9e96a84acb98ecb640a6376a5e4fabada6a1fba8 Mon Sep 17 00:00:00 2001 From: hermet Date: Mon, 28 Nov 2011 08:28:34 +0000 Subject: [PATCH] elementary/naviframe - implement unset hook git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@65638 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/elc_naviframe.c | 197 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 145 insertions(+), 52 deletions(-) diff --git a/src/lib/elc_naviframe.c b/src/lib/elc_naviframe.c index ad08646..65af19d 100644 --- a/src/lib/elc_naviframe.c +++ b/src/lib/elc_naviframe.c @@ -39,7 +39,7 @@ struct _Elm_Naviframe_Item Evas_Object *content; Evas_Object *title_prev_btn; Evas_Object *title_next_btn; - Evas_Object *icon; + Evas_Object *title_icon; const char *style; Evas_Coord minw; Evas_Coord minh; @@ -125,6 +125,12 @@ static void _title_prev_btn_set(Elm_Naviframe_Item *it, Eina_Bool back_btn); static void _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn); static void _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon); +static Evas_Object * _item_content_unset(Elm_Naviframe_Item *it); +static Evas_Object * _title_prev_btn_unset(Elm_Naviframe_Item *it); +static Evas_Object * _title_next_btn_unset(Elm_Naviframe_Item *it); +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 void _pushed_finished(void *data, Evas_Object *obj, @@ -359,7 +365,7 @@ _item_content_get_hook(const Elm_Object_Item *it, const char *part) else if (!strcmp(part, "next_btn")) return navi_it->title_next_btn; else if (!strcmp(part, "icon")) - return navi_it->icon; + return navi_it->title_icon; //common parts EINA_INLIST_FOREACH(navi_it->content_list, pair) @@ -374,53 +380,19 @@ static Evas_Object * _item_content_unset_hook(Elm_Object_Item *it, const char *part) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - Elm_Naviframe_Content_Item_Pair *pair = NULL; Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it; - Evas_Object *content = NULL; - char buf[1028]; //specified parts - //FIXME: could be unset the below specified contents also. - if (!part || - !strcmp(part, "default") || - !strcmp(part, "prev_btn") || - !strcmp(part, "next_btn") || - !strcmp(part, "icon")) - { - WRN("You can not unset the content! : naviframe=%p", - WIDGET(navi_it)); - return NULL; - } - - //common parts - EINA_INLIST_FOREACH(navi_it->content_list, pair) - { - if (!strcmp(part, pair->part)) - { - content = pair->content; - eina_stringshare_del(pair->part); - navi_it->content_list = eina_inlist_remove(navi_it->content_list, - EINA_INLIST_GET(pair)); - free(pair); - break; - } - } - - if (!content) return NULL; - - elm_widget_sub_object_del(WIDGET(navi_it), content); - edje_object_part_unswallow(VIEW(navi_it), content); - snprintf(buf, sizeof(buf), "elm,state,%s,hide", part); - edje_object_signal_emit(VIEW(navi_it), buf, "elm"); - evas_object_event_callback_del(content, - EVAS_CALLBACK_DEL, - _title_content_del); - evas_object_event_callback_del(content, - EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints); - _sizing_eval(WIDGET(navi_it)); + if (!part || !strcmp("default", part)) + return _item_content_unset(navi_it); + else if (!strcmp(part, "prev_btn")) + return _title_prev_btn_unset(navi_it); + else if (!strcmp(part, "next_btn")) + return _title_next_btn_unset(navi_it); + else if (!strcmp(part, "icon")) + return _title_icon_unset(navi_it); - return content; + return _title_content_unset(navi_it, part); } static void @@ -566,7 +538,7 @@ _title_icon_del(void *data, void *event_info __UNUSED__) { Elm_Naviframe_Item *it = data; - it->icon = NULL; + it->title_icon = NULL; edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm"); } @@ -699,12 +671,12 @@ _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn) static void _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon) { - if (it->icon == icon) return; + if (it->title_icon == icon) return; - if (it->icon) - evas_object_del(it->icon); + if (it->title_icon) + evas_object_del(it->title_icon); - it->icon = icon; + it->title_icon = icon; if (!icon) return; elm_widget_sub_object_add(WIDGET(it), icon); @@ -722,6 +694,127 @@ _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon) _sizing_eval(WIDGET(it)); } +static Evas_Object * +_item_content_unset(Elm_Naviframe_Item *it) +{ + Evas_Object *content = it->content; + if (!content) return NULL; + + elm_widget_sub_object_del(WIDGET(it), content); + edje_object_part_unswallow(VIEW(it), content); + edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm"); + evas_object_event_callback_del(content, + EVAS_CALLBACK_DEL, + _item_content_del); + evas_object_event_callback_del(content, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints); + _sizing_eval(WIDGET(it)); + + it->content = NULL; + return content; +} + +static Evas_Object * +_title_prev_btn_unset(Elm_Naviframe_Item *it) +{ + Evas_Object *content = it->title_prev_btn; + if (!content) return NULL; + + elm_widget_sub_object_del(WIDGET(it), content); + edje_object_part_unswallow(VIEW(it), content); + edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm"); + evas_object_event_callback_del(content, + EVAS_CALLBACK_DEL, + _title_prev_btn_del); + evas_object_event_callback_del(content, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints); + _sizing_eval(WIDGET(it)); + + it->title_prev_btn = NULL; + return content; +} + +static Evas_Object * +_title_next_btn_unset(Elm_Naviframe_Item *it) +{ + Evas_Object *content = it->title_next_btn; + if (!content) return NULL; + + elm_widget_sub_object_del(WIDGET(it), content); + edje_object_part_unswallow(VIEW(it), content); + edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm"); + evas_object_event_callback_del(content, + EVAS_CALLBACK_DEL, + _title_next_btn_del); + evas_object_event_callback_del(content, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints); + _sizing_eval(WIDGET(it)); + + it->title_next_btn = NULL; + return content; +} + +static Evas_Object * +_title_icon_unset(Elm_Naviframe_Item *it) +{ + Evas_Object *content = it->title_icon; + if (!content) return NULL; + + elm_widget_sub_object_del(WIDGET(it), content); + edje_object_part_unswallow(VIEW(it), content); + edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm"); + evas_object_event_callback_del(content, + EVAS_CALLBACK_DEL, + _title_icon_del); + evas_object_event_callback_del(content, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints); + _sizing_eval(WIDGET(it)); + + it->title_icon = NULL; + return content; +} + +static Evas_Object * +_title_content_unset(Elm_Naviframe_Item *it, const char *part) +{ + Elm_Naviframe_Content_Item_Pair *pair = NULL; + char buf[1028]; + Evas_Object *content; + + EINA_INLIST_FOREACH(it->content_list, pair) + { + if (!strcmp(part, pair->part)) + { + content = pair->content; + eina_stringshare_del(pair->part); + it->content_list = eina_inlist_remove(it->content_list, + EINA_INLIST_GET(pair)); + free(pair); + break; + } + } + + if (!content) return NULL; + + elm_widget_sub_object_del(WIDGET(it), content); + edje_object_part_unswallow(VIEW(it), content); + snprintf(buf, sizeof(buf), "elm,state,%s,hide", part); + edje_object_signal_emit(VIEW(it), buf, "elm"); + evas_object_event_callback_del(content, + EVAS_CALLBACK_DEL, + _title_content_del); + evas_object_event_callback_del(content, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints); + _sizing_eval(WIDGET(it)); + + return content; +} + static void _item_del(Elm_Naviframe_Item *it) @@ -739,8 +832,8 @@ _item_del(Elm_Naviframe_Item *it) evas_object_del(it->title_prev_btn); if (it->title_next_btn) evas_object_del(it->title_next_btn); - if (it->icon) - evas_object_del(it->icon); + if (it->title_icon) + evas_object_del(it->title_icon); if ((it->content) && (!wd->preserve)) evas_object_del(it->content); -- 2.7.4