X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_flipselector.c;h=7939aba8e08a3eaf5fa721d46310eb70ed69a60f;hb=8b32f3712183fc44ce1f965e8a95069fe2bbc6cd;hp=fa327b44612aee458f244d368a4b566ee68647f7;hpb=ff06cc99ac923ae032a4348fbcd628dceeccae5f;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_flipselector.c b/src/lib/elm_flipselector.c index fa327b4..7939aba 100644 --- a/src/lib/elm_flipselector.c +++ b/src/lib/elm_flipselector.c @@ -7,7 +7,6 @@ /* TODO: if one ever wants to extend it to receiving generic widgets as items, be my guest. in this case, remember to implement the items tooltip infra. */ -/* TODO: implement disabled mode -- disable_hook() and stuff. */ /* TODO: fix default theme image borders for looong strings as item labels. */ /* TODO: set text elipsis on labels if one enforces mininum size on @@ -57,6 +56,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 Eina_Bool _item_del_pre_hook(Elm_Object_Item *it); static const char SIG_SELECTED[] = "selected"; static const char SIG_UNDERFLOWED[] = "underflowed"; @@ -73,8 +73,6 @@ _item_text_set_hook(Elm_Object_Item *it, const char *part, const char *label) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it); - Widget_Data *wd; Eina_List *l; Elm_Flipselector_Item *item; @@ -83,7 +81,7 @@ _item_text_set_hook(Elm_Object_Item *it, if (part && strcmp(part ,"default")) return; - item = (Elm_Flipselector_Item *) it; + item = (Elm_Flipselector_Item *)it; wd = elm_widget_data_get(WIDGET(item)); if ((!wd) || (!wd->items)) return; @@ -106,21 +104,9 @@ _item_text_set_hook(Elm_Object_Item *it, static const char * _item_text_get_hook(const Elm_Object_Item *it, const char *part) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - - Elm_Flipselector_Item *item, *_item; - Widget_Data *wd; - Eina_List *l; - if (part && strcmp(part ,"default")) return NULL; - item = (Elm_Flipselector_Item *) it; - wd = elm_widget_data_get(WIDGET(item)); - if ((!wd) || (!wd->items)) return NULL; - - EINA_LIST_FOREACH(wd->items, l, _item) - if (_item == item) return item->label; - return NULL; + return ((Elm_Flipselector_Item *)it)->label; } static void @@ -128,8 +114,7 @@ _item_signal_emit_hook(Elm_Object_Item *it, const char *emission, const char *source) { - ELM_OBJ_ITEM_CHECK_OR_RETURN(it); - Elm_Flipselector_Item *item = (Elm_Flipselector_Item *) it; + Elm_Flipselector_Item *item = (Elm_Flipselector_Item *)it; edje_object_signal_emit(VIEW(item), emission, source); } @@ -143,6 +128,7 @@ _item_new(Evas_Object *obj, const char *label, Evas_Smart_Cb func, const void *d it = elm_widget_item_new(obj, Elm_Flipselector_Item); if (!it) return NULL; + elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook); elm_widget_item_text_set_hook_set(it, _item_text_set_hook); elm_widget_item_text_get_hook_set(it, _item_text_get_hook); elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook); @@ -164,7 +150,7 @@ static inline void _item_free(Elm_Flipselector_Item *it) { eina_stringshare_del(it->label); - elm_widget_item_del(it); + elm_widget_item_free(it); } static void @@ -185,6 +171,18 @@ _del_hook(Evas_Object *obj) } static void +_disable_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + + if (elm_widget_disabled_get(obj)) + edje_object_signal_emit(wd->base, "elm,state,disabled", "elm"); + else + edje_object_signal_emit(wd->base, "elm,state,enabled", "elm"); +} + +static void _theme_hook(Evas_Object *obj) { Widget_Data *wd; @@ -228,7 +226,7 @@ _sentinel_eval(Widget_Data *wd) EINA_LIST_FOREACH(wd->items, l, it) { - if (strlen(elm_object_item_text_get((Elm_Object_Item *) it)) > + if (strlen(elm_object_item_text_get((Elm_Object_Item *)it)) > strlen(elm_object_item_text_get(DATA_GET(wd->sentinel)))) wd->sentinel = l; } @@ -326,6 +324,7 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty return EINA_FALSE; if (wd->spin) ecore_timer_del(wd->spin); + wd->spin = NULL; /* TODO: if direction setting via API is not coming in, replace these calls by flip_{next,prev} */ @@ -372,15 +371,15 @@ _sizing_eval(Evas_Object *obj) if (wd->sentinel) { const char *label = elm_object_item_text_get(DATA_GET(wd->sentinel)); - tmp = edje_object_part_text_get(wd->base, "top"); - edje_object_part_text_set(wd->base, "top", label); + tmp = edje_object_part_text_get(wd->base, "elm.top"); + edje_object_part_text_escaped_set(wd->base, "elm.top", label); } edje_object_size_min_restricted_calc(wd->base, &minw, &minh, minw, minh); elm_coords_finger_size_adjust(1, &minw, 2, &minh); evas_object_size_hint_min_get(obj, &w, &h); - if (wd->sentinel) edje_object_part_text_set(wd->base, "top", tmp); + if (wd->sentinel) edje_object_part_text_escaped_set(wd->base, "elm.top", tmp); if (w > minw) minw = w; if (h > minh) minh = h; @@ -402,8 +401,8 @@ _update_view(Evas_Object *obj) item = DATA_GET(wd->current); if (item) label = item->label; - edje_object_part_text_set(wd->base, "top", label ? label : ""); - edje_object_part_text_set(wd->base, "bottom", label ? label : ""); + edje_object_part_text_escaped_set(wd->base, "elm.top", label ? label : ""); + edje_object_part_text_escaped_set(wd->base, "elm.bottom", label ? label : ""); edje_object_message_signal_process(wd->base); } @@ -574,6 +573,52 @@ _callbacks_set(Evas_Object *obj) "", _signal_val_change_stop, obj); } +static Eina_Bool +_item_del_pre_hook(Elm_Object_Item *it) +{ + 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 EINA_FALSE; + + if (wd->walking > 0) + { + item->deleted = EINA_TRUE; + return EINA_FALSE; + } + + _flipselector_walk(wd); + + EINA_LIST_FOREACH(wd->items, l, item2) + { + if (item2 == item) + { + wd->items = eina_list_remove_list(wd->items, l); + if (wd->current == l) + { + wd->current = l->prev; + if (!wd->current) wd->current = l->next; + if (wd->current) + { + item2 = wd->current->data; + _send_msg(wd, MSG_FLIP_DOWN, (char *)item2->label); + } + else + _send_msg(wd, MSG_FLIP_DOWN, ""); + } + break; + } + } + eina_stringshare_del(item->label); + _sentinel_eval(wd); + _flipselector_unwalk(wd); + + return EINA_TRUE; +} + EAPI Evas_Object * elm_flipselector_add(Evas_Object *parent) { @@ -591,7 +636,7 @@ elm_flipselector_add(Evas_Object *parent) wd->self = obj; elm_widget_del_hook_set(obj, _del_hook); elm_widget_theme_hook_set(obj, _theme_hook); - /* TODO: elm_widget_disable_hook_set(obj, _disable_hook); */ + elm_widget_disable_hook_set(obj, _disable_hook); elm_widget_can_focus_set(obj, EINA_TRUE); elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL); @@ -619,6 +664,7 @@ elm_flipselector_flip_next(Evas_Object *obj) if (!wd) return; if (wd->spin) ecore_timer_del(wd->spin); + wd->spin = NULL; _flipselector_walk(wd); _flip_down(wd); @@ -634,6 +680,7 @@ elm_flipselector_flip_prev(Evas_Object *obj) if (!wd) return; if (wd->spin) ecore_timer_del(wd->spin); + wd->spin = NULL; _flipselector_walk(wd); _flip_up(wd); @@ -662,7 +709,7 @@ elm_flipselector_item_append(Evas_Object *obj, const char *label, void (*func)(v } if (!wd->sentinel || - (strlen(elm_object_item_text_get((Elm_Object_Item *) item)) > + (strlen(elm_object_item_text_get((Elm_Object_Item *)item)) > strlen(elm_object_item_text_get(DATA_GET(wd->sentinel))))) { wd->sentinel = eina_list_last(wd->items); @@ -672,7 +719,7 @@ elm_flipselector_item_append(Evas_Object *obj, const char *label, void (*func)(v if (eina_list_count(wd->items) >= 2) edje_object_signal_emit(wd->base, "elm,state,button,visible", "elm"); - return (Elm_Object_Item *) item; + return (Elm_Object_Item *)item; } EAPI Elm_Object_Item * @@ -697,7 +744,7 @@ elm_flipselector_item_prepend(Evas_Object *obj, const char *label, void (*func)( } if (!wd->sentinel || - (strlen(elm_object_item_text_get((Elm_Object_Item *) item)) > + (strlen(elm_object_item_text_get((Elm_Object_Item *)item)) > strlen(elm_object_item_text_get(DATA_GET(wd->sentinel))))) { wd->sentinel = wd->items; @@ -707,10 +754,9 @@ elm_flipselector_item_prepend(Evas_Object *obj, const char *label, void (*func)( if (eina_list_count(wd->items) >= 2) edje_object_signal_emit(wd->base, "elm,state,button,visible", "elm"); - return (Elm_Object_Item *) item; + return (Elm_Object_Item *)item; } -/* TODO: account for deleted items? */ EAPI const Eina_List * elm_flipselector_items_get(const Evas_Object *obj) { @@ -736,7 +782,7 @@ elm_flipselector_first_item_get(const Evas_Object *obj) EINA_LIST_FOREACH(wd->items, l, it) { if (it->deleted) continue; - return (Elm_Object_Item *) it; + return (Elm_Object_Item *)it; } return NULL; } @@ -756,7 +802,7 @@ elm_flipselector_last_item_get(const Evas_Object *obj) EINA_LIST_REVERSE_FOREACH(wd->items, l, it) { if (it->deleted) continue; - return (Elm_Object_Item *) it; + return (Elm_Object_Item *)it; } return NULL; } @@ -767,7 +813,7 @@ elm_flipselector_selected_item_get(const Evas_Object *obj) ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd || !wd->current) return NULL; + if (!wd) return NULL; return DATA_GET(wd->current); } @@ -781,7 +827,7 @@ elm_flipselector_item_selected_set(Elm_Object_Item *it, Eina_Bool selected) Widget_Data *wd; Eina_List *l; - item = (Elm_Flipselector_Item *) it; + item = (Elm_Flipselector_Item *)it; wd = elm_widget_data_get(WIDGET(item)); if (!wd) return; @@ -827,98 +873,50 @@ elm_flipselector_item_selected_get(const Elm_Object_Item *it) Widget_Data *wd; Elm_Flipselector_Item *item; - item = (Elm_Flipselector_Item *) it; + item = (Elm_Flipselector_Item *)it; wd = elm_widget_data_get(WIDGET(item)); if (!wd) return EINA_FALSE; return (eina_list_data_get(wd->current) == item); } -EAPI void -elm_flipselector_item_del(Elm_Object_Item *it) -{ - ELM_OBJ_ITEM_CHECK_OR_RETURN(it); - 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->walking > 0) - { - item->deleted = EINA_TRUE; - return; - } - - _flipselector_walk(wd); - - wd->items = eina_list_remove(wd->items, item); - _item_free(item); - _sentinel_eval(wd); - _flipselector_unwalk(wd); -} - -EAPI const char * -elm_flipselector_item_label_get(const Elm_Object_Item *it) -{ - return _item_text_get_hook(it, NULL); -} - -EAPI void -elm_flipselector_item_label_set(Elm_Object_Item *it, const char *label) -{ - _item_text_set_hook(it, NULL, label); -} - EAPI Elm_Object_Item * -elm_flipselector_item_prev_get(Elm_Object_Item *it) +elm_flipselector_item_prev_get(const Elm_Object_Item *it) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - Elm_Flipselector_Item *item, *_item; Widget_Data *wd; Eina_List *l; + Elm_Flipselector_Item *item = (Elm_Flipselector_Item *)it; - item = (Elm_Flipselector_Item *) it; wd = elm_widget_data_get(WIDGET(item)); if ((!wd) || (!wd->items)) return NULL; - EINA_LIST_FOREACH(wd->items, l, _item) - if (_item == item) - { - l = eina_list_prev(l); - if (!l) return NULL; - return DATA_GET(l); - } + l = eina_list_data_find_list(wd->items, it); + if (l && l->prev) return DATA_GET(l->prev); + return NULL; } EAPI Elm_Object_Item * -elm_flipselector_item_next_get(Elm_Object_Item *it) +elm_flipselector_item_next_get(const Elm_Object_Item *it) { ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL); - Elm_Flipselector_Item *item, *_item; Widget_Data *wd; Eina_List *l; + Elm_Flipselector_Item *item = (Elm_Flipselector_Item *)it; - item = (Elm_Flipselector_Item *) it; wd = elm_widget_data_get(WIDGET(item)); if ((!wd) || (!wd->items)) return NULL; - EINA_LIST_FOREACH(wd->items, l, _item) - if (_item == item) - { - l = eina_list_next(l); - if (!l) return NULL; - return DATA_GET(l); - } + l = eina_list_data_find_list(wd->items, it); + if (l && l->next) return DATA_GET(l->next); + return NULL; } EAPI void -elm_flipselector_interval_set(Evas_Object *obj, double interval) +elm_flipselector_first_interval_set(Evas_Object *obj, double interval) { ELM_CHECK_WIDTYPE(obj, widtype); @@ -928,9 +926,9 @@ elm_flipselector_interval_set(Evas_Object *obj, double interval) } EAPI double -elm_flipselector_interval_get(const Evas_Object *obj) +elm_flipselector_first_interval_get(const Evas_Object *obj) { - ELM_CHECK_WIDTYPE(obj, widtype) 0.0; + ELM_CHECK_WIDTYPE(obj, widtype) 0; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return 0;