From d7cc17390cbaaddeaf15a1bf66629e880e06f12b Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Sat, 15 Oct 2011 14:21:51 +0900 Subject: [PATCH] naviframe - eina_list -> eina_inlist + theme_hook --- src/lib/elc_naviframe.c | 141 ++++++++++++++++++++++++++++-------------------- 1 file changed, 83 insertions(+), 58 deletions(-) diff --git a/src/lib/elc_naviframe.c b/src/lib/elc_naviframe.c index ad0c40e..5be6505 100644 --- a/src/lib/elc_naviframe.c +++ b/src/lib/elc_naviframe.c @@ -8,7 +8,7 @@ typedef struct _Elm_Naviframe_Text_Item_Pair Elm_Naviframe_Text_Item_Pair; struct _Widget_Data { - Eina_List *stack; + Eina_Inlist *stack; Evas_Object *base; Evas_Object *rect; Eina_Bool preserve: 1; @@ -18,6 +18,7 @@ struct _Widget_Data struct _Elm_Naviframe_Content_Item_Pair { + EINA_INLIST; const char *part; Evas_Object *content; Elm_Naviframe_Item *it; @@ -25,6 +26,7 @@ struct _Elm_Naviframe_Content_Item_Pair struct _Elm_Naviframe_Text_Item_Pair { + EINA_INLIST; const char *part; const char *text; }; @@ -32,8 +34,9 @@ struct _Elm_Naviframe_Text_Item_Pair struct _Elm_Naviframe_Item { Elm_Widget_Item base; - Eina_List *content_list; - Eina_List *text_list; + EINA_INLIST; + Eina_Inlist *content_list; + Eina_Inlist *text_list; Evas_Object *content; Evas_Object *title_prev_btn; Evas_Object *title_next_btn; @@ -75,6 +78,7 @@ static Evas_Object *_item_content_unset_hook(Elm_Object_Item *it, static void _item_signal_emit_hook(Elm_Object_Item *it, const char *emission, const char *source); +static void _item_title_visible_update(Elm_Naviframe_Item *navi_it); static void _sizing_eval(Evas_Object *obj); static void _item_sizing_eval(Elm_Naviframe_Item *it); static void _move(void *data, Evas *e, Evas_Object *obj, void *event_info); @@ -134,24 +138,42 @@ static void _del_hook(Evas_Object *obj) { Widget_Data *wd; - Eina_List *list; Elm_Naviframe_Item *it; wd = elm_widget_data_get(obj); if (!wd) return; - EINA_LIST_REVERSE_FOREACH(wd->stack, list, it) + EINA_INLIST_REVERSE_FOREACH(wd->stack, it) _item_del(it); - eina_list_free(wd->stack); free(wd); } static void _theme_hook(Evas_Object *obj) { - //FIXME: + Widget_Data *wd; + Elm_Naviframe_Item *it; + + wd = elm_widget_data_get(obj); + if (!wd) return; + + _elm_theme_object_set(obj, + wd->base, + "naviframe", + "base", + elm_widget_style_get(obj)); + + EINA_INLIST_FOREACH(wd->stack, it) + { + elm_naviframe_item_style_set(ELM_CAST(it), it->style); + _item_title_visible_update(it); + } + _elm_widget_mirrored_reload(obj); _mirrored_set(obj, elm_widget_mirrored_get(obj)); + + evas_object_hide(wd->rect); + } static void _emit_hook(Evas_Object *obj, @@ -176,13 +198,12 @@ static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl) { Widget_Data *wd; - Eina_List *l; Elm_Naviframe_Item *it; wd = elm_widget_data_get(obj); if (!wd) return; - EINA_LIST_FOREACH(wd->stack, l, it) + EINA_INLIST_FOREACH(wd->stack, it) edje_object_mirrored_set(it->base.view, rtl); edje_object_mirrored_set(wd->base, rtl); } @@ -194,7 +215,6 @@ _item_text_set_hook(Elm_Object_Item *it, { ELM_OBJ_ITEM_CHECK_OR_RETURN(it); - Eina_List *l = NULL; Elm_Naviframe_Text_Item_Pair *pair = NULL; Elm_Naviframe_Item *navi_it = ELM_CAST(it); char buf[1024]; @@ -204,7 +224,7 @@ _item_text_set_hook(Elm_Object_Item *it, else snprintf(buf, sizeof(buf), "%s", part); - EINA_LIST_FOREACH(navi_it->text_list, l, pair) + EINA_INLIST_FOREACH(navi_it->text_list, pair) if (!strcmp(buf, pair->part)) break; if (!pair) @@ -217,7 +237,8 @@ _item_text_set_hook(Elm_Object_Item *it, return; } eina_stringshare_replace(&pair->part, buf); - navi_it->text_list = eina_list_append(navi_it->text_list, pair); + navi_it->text_list = eina_inlist_append(navi_it->text_list, + EINA_INLIST_GET(pair)); } eina_stringshare_replace(&pair->text, label); @@ -241,7 +262,6 @@ static const char * _item_text_get_hook(const Elm_Object_Item *it, const char *part) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - Eina_List *l = NULL; Elm_Naviframe_Text_Item_Pair *pair = NULL; Elm_Naviframe_Item *navi_it = ELM_CAST(it); char buf[1024]; @@ -251,7 +271,7 @@ _item_text_get_hook(const Elm_Object_Item *it, const char *part) else snprintf(buf, sizeof(buf), "%s", part); - EINA_LIST_FOREACH(navi_it->text_list, l, pair) + EINA_INLIST_FOREACH(navi_it->text_list, pair) { if (!strcmp(buf, pair->part)) return pair->text; @@ -294,7 +314,6 @@ static Evas_Object * _item_content_get_hook(const Elm_Object_Item *it, const char *part) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - Eina_List *l = NULL; Elm_Naviframe_Content_Item_Pair *pair = NULL; Elm_Naviframe_Item *navi_it = ELM_CAST(it); @@ -307,7 +326,7 @@ _item_content_get_hook(const Elm_Object_Item *it, const char *part) return navi_it->title_next_btn; //common parts - EINA_LIST_FOREACH(navi_it->content_list, l, pair) + EINA_INLIST_FOREACH(navi_it->content_list, pair) { if (!strcmp(part, pair->part)) return pair->content; @@ -319,7 +338,6 @@ static Evas_Object * _item_content_unset_hook(Elm_Object_Item *it, const char *part) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - Eina_List *l = NULL; Elm_Naviframe_Content_Item_Pair *pair = NULL; Elm_Naviframe_Item *navi_it = ELM_CAST(it); Evas_Object *content = NULL; @@ -338,14 +356,14 @@ _item_content_unset_hook(Elm_Object_Item *it, const char *part) } //common parts - EINA_LIST_FOREACH(navi_it->content_list, l, pair) + 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_list_remove(navi_it->content_list, - pair); + navi_it->content_list = eina_inlist_remove(navi_it->content_list, + EINA_INLIST_GET(pair)); free(pair); break; } @@ -376,18 +394,23 @@ _item_signal_emit_hook(Elm_Object_Item *it, } static void +_item_title_visible_update(Elm_Naviframe_Item *navi_it) +{ + if (navi_it->title_visible) + edje_object_signal_emit(navi_it->base.view, "elm,state,title,show", "elm"); + else + edje_object_signal_emit(navi_it->base.view, "elm,state,title,hide", "elm"); +} + +static void _sizing_eval(Evas_Object *obj) { Widget_Data *wd; - Eina_List *list; Elm_Naviframe_Item *it; wd = elm_widget_data_get(obj); if (!wd) return; - list = eina_list_last(wd->stack); - if (!list) return; - - EINA_LIST_FOREACH(wd->stack, list, it) + EINA_INLIST_FOREACH(wd->stack, it) _item_sizing_eval(it); } @@ -492,7 +515,8 @@ _title_content_del(void *data, Elm_Naviframe_Item *it = pair->it; snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part); edje_object_signal_emit(it->base.view, buf, "elm"); - it->content_list = eina_list_remove(it->content_list, pair); + it->content_list = eina_inlist_remove(it->content_list, + EINA_INLIST_GET(pair)); eina_stringshare_del(pair->part); free(pair); } @@ -537,10 +561,9 @@ _title_content_set(Elm_Naviframe_Item *it, const char *part, Evas_Object *content) { - Eina_List *l = NULL; char buf[1024]; - EINA_LIST_FOREACH(it->content_list, l, pair) + EINA_INLIST_FOREACH(it->content_list, pair) if (!strcmp(part, pair->part)) break; if (!pair) @@ -553,7 +576,8 @@ _title_content_set(Elm_Naviframe_Item *it, } pair->it = it; eina_stringshare_replace(&pair->part, part); - it->content_list = eina_list_append(it->content_list, pair); + it->content_list = eina_inlist_append(it->content_list, + EINA_INLIST_GET(pair)); } if ((pair->content) && (pair->content != content)) @@ -649,7 +673,6 @@ static void _item_del(Elm_Naviframe_Item *it) { Widget_Data *wd; - Eina_List *l; Elm_Naviframe_Content_Item_Pair *content_pair; Elm_Naviframe_Text_Item_Pair *text_pair; @@ -665,25 +688,29 @@ _item_del(Elm_Naviframe_Item *it) if ((it->content) && (!wd->preserve)) evas_object_del(it->content); - EINA_LIST_FOREACH(it->content_list, l, content_pair) + EINA_INLIST_REVERSE_FOREACH(it->content_list, content_pair) { - evas_object_event_callback_del(content_pair->content, EVAS_CALLBACK_DEL, _title_content_del); + evas_object_event_callback_del(content_pair->content, + EVAS_CALLBACK_DEL, + _title_content_del); evas_object_del(content_pair->content); eina_stringshare_del(content_pair->part); + it->content_list = + eina_inlist_remove(it->content_list, + EINA_INLIST_GET(content_pair)); free(content_pair); } - EINA_LIST_FOREACH(it->text_list, l, text_pair) + EINA_INLIST_REVERSE_FOREACH(it->text_list, text_pair) { eina_stringshare_del(text_pair->part); eina_stringshare_del(text_pair->text); + it->text_list = eina_inlist_remove(it->text_list, + EINA_INLIST_GET(text_pair)); free(text_pair); } - eina_list_free(it->content_list); - eina_list_free(it->text_list); - - wd->stack = eina_list_remove(wd->stack, it); + wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(it)); elm_widget_item_del(it); } @@ -854,7 +881,7 @@ elm_naviframe_item_push(Evas_Object *obj, _item_text_set_hook(ELM_CAST(it), "elm.text.title", title_label); //title buttons - if ((!prev_btn) && wd->auto_pushed && eina_list_count(wd->stack)) + if ((!prev_btn) && wd->auto_pushed && eina_inlist_count(wd->stack)) { prev_btn = _back_btn_new(obj); _title_prev_btn_set(it, prev_btn, EINA_TRUE); @@ -886,7 +913,7 @@ elm_naviframe_item_push(Evas_Object *obj, "elm"); } it->title_visible = EINA_TRUE; - wd->stack = eina_list_append(wd->stack, it); + wd->stack = eina_inlist_append(wd->stack, EINA_INLIST_GET(it)); return ELM_CAST(it); } @@ -894,7 +921,7 @@ EAPI Evas_Object * elm_naviframe_item_pop(Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Elm_Naviframe_Item *it, *prev_it; + Elm_Naviframe_Item *it, *prev_it = NULL; Widget_Data *wd; Evas_Object *content = NULL; @@ -903,12 +930,12 @@ elm_naviframe_item_pop(Evas_Object *obj) it = ELM_CAST(elm_naviframe_top_item_get(obj)); if (!it) return NULL; - wd->stack = eina_list_remove(wd->stack, it); - if (wd->preserve) content = it->content; - prev_it = ELM_CAST(elm_naviframe_top_item_get(obj)); + if (wd->stack->last->prev) + prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev, + Elm_Naviframe_Item); if (prev_it) { if (wd->freeze_events) @@ -936,17 +963,18 @@ elm_naviframe_item_pop_to(Elm_Object_Item *it) ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Naviframe_Item *navi_it = ELM_CAST(it); Widget_Data *wd = elm_widget_data_get(navi_it->base.widget); - Eina_List *l, *prev_l; + Eina_Inlist *l, *prev_l; if (it == elm_naviframe_top_item_get(navi_it->base.widget)) return; - l = eina_list_last(wd->stack)->prev; + l = wd->stack->last->prev; while(l) { - if (l->data == it) break; + if (ELM_CAST(EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item)) == it) + break; prev_l = l->prev; - _item_del(l->data); + _item_del(EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item)); l = prev_l; } elm_naviframe_item_pop(navi_it->base.widget); @@ -961,7 +989,7 @@ elm_naviframe_item_del(Elm_Object_Item *it) if (it == elm_naviframe_top_item_get(navi_it->base.widget)) { _item_del(navi_it); - navi_it = ELM_CAST(eina_list_last(wd->stack)->data); + navi_it = ELM_CAST(EINA_INLIST_CONTAINER_GET(wd->stack->last, Elm_Naviframe_Item)); evas_object_show(navi_it->base.view); evas_object_raise(navi_it->base.view); edje_object_signal_emit(navi_it->base.view, "elm,state,visible", "elm"); @@ -994,7 +1022,8 @@ elm_naviframe_top_item_get(const Evas_Object *obj) ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); if ((!wd) || (!wd->stack)) return NULL; - return eina_list_last(wd->stack)->data; + return ELM_CAST(EINA_INLIST_CONTAINER_GET(wd->stack->last, + Elm_Naviframe_Item)); } EAPI Elm_Object_Item* @@ -1003,7 +1032,8 @@ elm_naviframe_bottom_item_get(const Evas_Object *obj) ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); if ((!wd) || (!wd->stack)) return NULL; - return wd->stack->data; + return ELM_CAST(EINA_INLIST_CONTAINER_GET(wd->stack, + Elm_Naviframe_Item)); } EAPI void @@ -1011,7 +1041,6 @@ elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it); Elm_Naviframe_Item *navi_it = ELM_CAST(it); - Eina_List *l; Elm_Naviframe_Content_Item_Pair *content_pair; Elm_Naviframe_Text_Item_Pair *text_pair; Widget_Data *wd; @@ -1031,10 +1060,10 @@ elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style) buf, elm_widget_style_get(navi_it->base.widget)); //recover item - EINA_LIST_FOREACH(navi_it->text_list, l, text_pair) + EINA_INLIST_FOREACH(navi_it->text_list, text_pair) _item_text_set_hook(it, text_pair->part, text_pair->text); - EINA_LIST_FOREACH(navi_it->content_list, l, content_pair) + EINA_INLIST_FOREACH(navi_it->content_list, content_pair) _item_content_set_hook(it, content_pair->part, content_pair->content); //content @@ -1089,12 +1118,8 @@ elm_naviframe_item_title_visible_set(Elm_Object_Item *it, Eina_Bool visible) visible = !!visible; if (navi_it->title_visible == visible) return; - if (visible) - edje_object_signal_emit(navi_it->base.view, "elm,state,title,show", "elm"); - else - edje_object_signal_emit(navi_it->base.view, "elm,state,title,hide", "elm"); - navi_it->title_visible = visible; + _item_title_visible_update(navi_it); } EAPI Eina_Bool -- 2.7.4