X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_genlist.c;h=4c3ba60822890e0e3a6557acf0de108e8318d19e;hb=00a94c5df27d133d132de9cdc2b2c78061454026;hp=5b8694bb0adeb8fa55bae6f2b6c57da8abb0538e;hpb=5cd8c83e1317355b299608b7e1dad4d52fe4ff8d;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 5b8694b..4c3ba60 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -22,7 +22,8 @@ EAPI const char ELM_GENLIST_PAN_SMART_NAME[] = "elm_genlist_pan"; #define GL_IT(_it) (_it->item) #define IS_ROOT_PARENT_IT(_it) \ - ((_it->group) || (GL_IT(_it)->items && GL_IT(_it)->expanded_depth == 0)) \ + ((_it->group) || ((GL_IT(_it)->items && GL_IT(_it)->expanded_depth == 0) \ + &&(!(GL_IT(_it)->type & ELM_GENLIST_ITEM_TREE)))) \ static const Evas_Smart_Interface *_smart_interfaces[] = { @@ -144,7 +145,7 @@ static void _item_select(Elm_Gen_Item *it); static void _expand_toggle_signal_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__); static void _expand_signal_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__); static void _contract_signal_cb(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__); -static void _elm_genlist_item_state_update(Elm_Gen_Item *it, Item_Cache *ic); +static void _elm_genlist_item_state_update(Elm_Gen_Item *it); static void _decorate_item_unrealize(Elm_Gen_Item *it); static void _decorate_all_item_unrealize(Elm_Gen_Item *it); static void _decorate_item_set(Elm_Gen_Item *it); @@ -153,7 +154,7 @@ static void _changed_job(Elm_Genlist_Smart_Data *sd); #if GENLIST_FX_SUPPORT static Eina_Bool _elm_genlist_fx_capture(Evas_Object *obj, int level); static void _elm_genlist_fx_play(Evas_Object *obj); -static void _elm_genlist_fx_clear(Evas_Object *obj); +static void _elm_genlist_fx_clear(Evas_Object *obj, Eina_Bool force); static void _elm_genlist_proxy_item_del(const Elm_Object_Item *item); #endif @@ -467,13 +468,12 @@ _elm_genlist_pan_smart_resize(Evas_Object *obj, evas_object_geometry_get(obj, NULL, NULL, &ow, &oh); if ((ow == w) && (oh == h)) return; - psd->wsd->s_iface->content_viewport_size_get - (ELM_WIDGET_DATA(psd->wsd)->obj, &vw, NULL); - if (vw != 0) psd->wsd->prev_viewport_w = vw; - - - if (psd->wsd->mode == ELM_LIST_COMPRESS) + psd->wsd->s_iface->content_viewport_size_get(ELM_WIDGET_DATA(psd->wsd)->obj, + &vw, NULL); + if (psd->wsd->mode == ELM_LIST_COMPRESS && + vw != psd->wsd->prev_viewport_w) psd->wsd->size_changed = EINA_TRUE; + if (vw != 0) psd->wsd->prev_viewport_w = vw; psd->wsd->pan_changed = EINA_TRUE; if (psd->wsd->calc_job) ecore_job_del(psd->wsd->calc_job); @@ -962,65 +962,30 @@ _item_order_update(const Eina_Inlist *l, } static void -_elm_genlist_item_state_update(Elm_Gen_Item *it, - Item_Cache *itc) +_elm_genlist_item_state_update(Elm_Gen_Item *it) { - if (itc) + if (it->selected) { - if (it->selected != itc->selected) - { - if (it->selected) - { - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, "elm,state,selected", "elm,nosound"); - edje_object_signal_emit - (VIEW(it), "elm,state,selected", "elm,nosound"); - evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it); - } - } - if (elm_widget_item_disabled_get(it) != itc->disabled) - { - if (elm_widget_item_disabled_get(it)) - edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, "elm,state,disabled", "elm"); - } - if (it->item->expanded != itc->expanded) - { - if (it->item->expanded) - edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, "elm,state,expanded", "elm"); - } + if (it->deco_all_view) + edje_object_signal_emit + (it->deco_all_view, "elm,state,selected", "elm"); + edje_object_signal_emit + (VIEW(it), "elm,state,selected", "elm"); + evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it); } - else + if (elm_widget_item_disabled_get(it)) { - if (it->selected) - { - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, "elm,state,selected", "elm,nosound"); - edje_object_signal_emit - (VIEW(it), "elm,state,selected", "elm,nosound"); - evas_object_smart_callback_call(WIDGET(it), SIG_HIGHLIGHTED, it); - } - if (elm_widget_item_disabled_get(it)) - { - edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, "elm,state,disabled", "elm"); - } - if (it->item->expanded) - { - edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm"); - if (it->deco_all_view) - edje_object_signal_emit - (it->deco_all_view, "elm,state,expanded", "elm"); - } + edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm"); + if (it->deco_all_view) + edje_object_signal_emit + (it->deco_all_view, "elm,state,disabled", "elm"); + } + if (it->item->expanded) + { + edje_object_signal_emit(VIEW(it), "elm,state,expanded", "elm"); + if (it->deco_all_view) + edje_object_signal_emit + (it->deco_all_view, "elm,state,expanded", "elm"); } } @@ -1121,16 +1086,8 @@ _item_mode_content_realize(Elm_Gen_Item *it, // 1. Add resize callback for multiline entry. // 2. Do not unrealize it for focus issue // ps. Only for entry because of performnace - if (!strcmp("elm_layout", evas_object_type_get(ic))) - { - // If editfield style, it can have entry. - const char *group; - edje_object_file_get(elm_layout_edje_get(ic), NULL, &group); - if (group && !strncmp("elm/layout/editfield/", group, 20)) - it->item->unrealize_disabled = EINA_TRUE; - } - else if (!strcmp("elm_entry", evas_object_type_get(ic))) - it->item->unrealize_disabled = EINA_TRUE; + if (!strcmp("elm_entry", evas_object_type_get(ic))) + it->item->unrealize_disabled = EINA_TRUE; } #endif #if 0 @@ -1269,7 +1226,7 @@ _decorate_all_item_realize(Elm_Gen_Item *it, (it->deco_all_view, elm_widget_mirrored_get(WIDGET(it))); _elm_genlist_item_odd_even_update(it); - _elm_genlist_item_state_update(it, NULL); + _elm_genlist_item_state_update(it); #if 1 // FIXME: difference from upstream if (GL_IT(it)->wsd->reorder_mode) @@ -1412,25 +1369,12 @@ _item_content_realize(Elm_Gen_Item *it, // 1. Add resize callback for multiline entry. // 2. Do not unrealize it for focus issue // ps. Only for entry because of performnace - if (!strcmp("elm_layout", evas_object_type_get(ic))) + if (!strcmp("elm_entry", evas_object_type_get(ic))) { - // If editfield style, it can have entry. - const char *group; - edje_object_file_get(elm_layout_edje_get(ic), NULL, &group); - if (group && !strncmp("elm/layout/editfield/", group, 20)) - { - evas_object_event_callback_add - (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, it); - it->item->unrealize_disabled = EINA_TRUE; - } - - } - else if (!strcmp("elm_entry", evas_object_type_get(ic))) - { - evas_object_event_callback_add - (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, it); + if (!elm_entry_single_line_get(ic)) + evas_object_event_callback_add + (ic, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, it); it->item->unrealize_disabled = EINA_TRUE; } #endif @@ -1544,7 +1488,6 @@ _item_realize(Elm_Gen_Item *it, int in, Eina_Bool calc) { - Item_Cache *itc = NULL; const char *treesize; char buf[1024]; int tsize = 20; @@ -1554,7 +1497,7 @@ _item_realize(Elm_Gen_Item *it, if (it->item->order_num_in != in) { _item_order_update(EINA_INLIST_GET(it), in); - _elm_genlist_item_state_update(it, NULL); + _elm_genlist_item_state_update(it); _elm_genlist_item_index_update(it); } return; @@ -1654,7 +1597,7 @@ _item_realize(Elm_Gen_Item *it, (it->itc->decorate_all_item_style)) _decorate_all_item_realize(it, EINA_FALSE); - _elm_genlist_item_state_update(it, itc); + _elm_genlist_item_state_update(it); _elm_genlist_item_index_update(it); } @@ -1867,7 +1810,7 @@ _reorder_move_animator_cb(void *data) Eina_Bool down = EINA_FALSE; int y, dy, diff; - dy = 6 * elm_config_scale_get(); + dy = 20 * elm_config_scale_get(); t = ((0.0 > (t = ecore_loop_time_get() - GL_IT(it)->wsd->start_time)) ? 0.0 : t); @@ -2150,7 +2093,8 @@ _changed_job(Elm_Genlist_Smart_Data *sd) sd->group_item_width = mw; sd->group_item_height = mh; } - else if ((!sd->item_width) && (it->item->type == ELM_GENLIST_ITEM_NONE)) + else if ((!sd->item_width) && + (it->item->type == ELM_GENLIST_ITEM_NONE)) { sd->item_width = mw; sd->item_height = mh; @@ -2207,7 +2151,7 @@ _elm_genlist_pan_smart_calculate(Evas_Object *obj) #if GROUP_ITEMS_FEATURE git->item->want_realize = EINA_FALSE; #else - _item_unrealize(git, EINA_TRUE); + evas_object_hide(VIEW(git)); #endif } @@ -2635,11 +2579,7 @@ _elm_genlist_smart_focus_next(const Evas_Object *obj, if (it->realized) { evas_object_geometry_get(it->base.view, &x, &y, &w, &h); - - /* check item which displays more than half of its size */ - if (ELM_RECTS_INTERSECT - (x + (w / 2), y + (h / 2), 0, 0, sx, sy, sw, sh)) - items = eina_list_append(items, it->base.access_obj); + items = eina_list_append(items, it->base.access_obj); if (!it->base.access_order) continue; @@ -3018,7 +2958,7 @@ _decorate_all_item_unrealize(Elm_Gen_Item *it) evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj); elm_widget_sub_object_add(WIDGET(it), VIEW(it)); _elm_genlist_item_odd_even_update(it); - _elm_genlist_item_state_update(it, NULL); + _elm_genlist_item_state_update(it); edje_object_signal_emit (it->deco_all_view, "elm,state,decorate,disabled", "elm"); @@ -3460,11 +3400,6 @@ _item_multi_down_cb(void *data, GL_IT(it)->wsd->multi_touched = EINA_TRUE; GL_IT(it)->wsd->prev_mx = ev->canvas.x; GL_IT(it)->wsd->prev_my = ev->canvas.y; - /* - if (!GL_IT(it)->wsd->wasselected) - _item_unselect(it); - GL_IT(it)->wsd->wasselected = EINA_FALSE; - */ if (it->long_timer) { ecore_timer_del(it->long_timer); @@ -3968,39 +3903,28 @@ _queue_process(Elm_Genlist_Smart_Data *sd) } static Eina_Bool -_idle_process(void *data, - Eina_Bool *wakeup) -{ - Elm_Genlist_Smart_Data *sd = data; - - if (_queue_process(sd) > 0) *wakeup = EINA_TRUE; - if (!sd->queue) - { - return ECORE_CALLBACK_CANCEL; - } -#if GENLIST_FX_SUPPORT - if (sd->fx_first_captured) - _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj); -#endif - return ECORE_CALLBACK_RENEW; -} - -static Eina_Bool _item_idle_enterer(void *data) { - Eina_Bool wakeup = EINA_FALSE; Elm_Genlist_Smart_Data *sd = data; - Eina_Bool ok = _idle_process(data, &wakeup); - if (wakeup) + if (sd->prev_viewport_w == 0) return ECORE_CALLBACK_RENEW; + if (_queue_process(sd) > 0) { // wake up mainloop + // Job always be alive because idle_enterer should be alive if (sd->calc_job) ecore_job_del(sd->calc_job); sd->calc_job = ecore_job_add(_calc_job, sd); } - if (ok == ECORE_CALLBACK_CANCEL) sd->queue_idle_enterer = NULL; + if (!sd->queue) + { + sd->queue_idle_enterer = NULL; + return ECORE_CALLBACK_CANCEL; + } - return ok; +#if GENLIST_FX_SUPPORT + _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE); +#endif + return ECORE_CALLBACK_RENEW; } static void @@ -4481,6 +4405,9 @@ static void _scroll_animate_start_cb(Evas_Object *obj, void *data __UNUSED__) { +#if GENLIST_FX_SUPPORT + _elm_genlist_fx_clear(obj, EINA_FALSE); +#endif evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_START, NULL); } @@ -4488,6 +4415,9 @@ static void _scroll_animate_stop_cb(Evas_Object *obj, void *data __UNUSED__) { +#if GENLIST_FX_SUPPORT + _elm_genlist_fx_clear(obj, EINA_FALSE); +#endif evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_STOP, NULL); } @@ -5507,7 +5437,7 @@ elm_genlist_item_sorted_insert(Evas_Object *obj, } static void -_elm_genlist_fx_clear(Evas_Object *obj) +_elm_genlist_fx_clear(Evas_Object *obj, Eina_Bool force) { ELM_GENLIST_DATA_GET(obj, sd); @@ -5515,6 +5445,8 @@ _elm_genlist_fx_clear(Evas_Object *obj) Proxy_Item *pi; Elm_Gen_Item *it; + if ((!force) && (!sd->fx_first_captured)) return; + EINA_LIST_FREE(sd->capture_before_items, pi) { if ((pi->it) && (GL_IT(pi->it))) GL_IT(pi->it)->has_proxy_it = EINA_FALSE; @@ -5575,7 +5507,7 @@ elm_genlist_clear(Evas_Object *obj) #if GENLIST_FX_SUPPORT if (sd->fx_mode) { - _elm_genlist_fx_clear(obj); + _elm_genlist_fx_clear(obj, EINA_TRUE); sd->genlist_clearing = EINA_TRUE; sd->rendered = EINA_FALSE; } @@ -6111,8 +6043,7 @@ elm_genlist_item_update(Elm_Object_Item *item) #endif #if GENLIST_FX_SUPPORT - if (GL_IT(it)->wsd->fx_first_captured) - _elm_genlist_fx_clear(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj); + _elm_genlist_fx_clear(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj, EINA_FALSE); #endif if (GL_IT(it)->wsd->update_job) ecore_job_del(GL_IT(it)->wsd->update_job); @@ -6192,6 +6123,7 @@ elm_genlist_item_item_class_update(Elm_Object_Item *item, if (!it->item->block) return; EINA_SAFETY_ON_NULL_RETURN(itc); it->itc = itc; + it->item->nocache_once = EINA_TRUE; elm_widget_stringlist_free(it->texts); @@ -6683,9 +6615,7 @@ elm_genlist_decorate_mode_set(Evas_Object *obj, } } #if GENLIST_FX_SUPPORT - if (sd->fx_first_captured) - _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj); - + _elm_genlist_fx_clear(ELM_WIDGET_DATA(sd)->obj, EINA_FALSE); #endif if (sd->calc_job) ecore_job_del(sd->calc_job); sd->calc_job = ecore_job_add(_calc_job, sd); @@ -6894,7 +6824,6 @@ elm_genlist_item_select_mode_set(Elm_Object_Item *item, Elm_Gen_Item *it = (Elm_Gen_Item *)item; ELM_GENLIST_ITEM_CHECK_OR_RETURN(item); - if (!it) return; if (mode >= ELM_OBJECT_SELECT_MODE_MAX) return; if (it->select_mode != mode) @@ -6933,8 +6862,6 @@ elm_genlist_item_select_mode_get(const Elm_Object_Item *item) ELM_GENLIST_ITEM_CHECK_OR_RETURN(item, ELM_OBJECT_SELECT_MODE_MAX); - if (!it) return ELM_OBJECT_SELECT_MODE_MAX; - return it->select_mode; } @@ -7024,7 +6951,11 @@ _elm_genlist_proxy_item_new(const Elm_Object_Item *item) pi->proxy = evas_object_image_filled_add (evas_object_evas_get(ELM_WIDGET_DATA(GL_IT(it)->wsd)->obj)); - if (!pi->proxy) return EINA_FALSE; + if (!pi->proxy) + { + free(pi); + return NULL; + } evas_object_clip_set(pi->proxy, evas_object_clip_get(GL_IT(it)->wsd->pan_obj)); evas_object_smart_member_add(pi->proxy, GL_IT(it)->wsd->pan_obj); evas_object_hide(pi->proxy); @@ -7406,7 +7337,8 @@ _item_fx_done(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__) Elm_Gen_FX_Item *fx_done_it = data; Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd; - if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return; + if (!fx_done_it) return; + if ((!fx_done_it->it) || (!sd)) return; evas_object_image_source_visible_set(fx_done_it->proxy, EINA_TRUE); evas_object_lower(fx_done_it->proxy); @@ -7429,7 +7361,8 @@ _item_fx_del_cb(void *data, Elm_Transit *transit __UNUSED__) Eina_List *l; Elm_Genlist_Smart_Data *sd = GL_IT(fx_done_it->it)->wsd; - if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return; + if (!fx_done_it) return; + if ((!fx_done_it->it) || (!sd)) return; sd->fx_items = eina_list_remove(sd->fx_items, fx_done_it); GL_IT(fx_done_it->it)->fi = NULL; @@ -7536,7 +7469,7 @@ _elm_genlist_fx_play(Evas_Object *obj) _elm_genlist_fx_items_make(obj); if (!eina_list_count(sd->fx_items) || (sd->queue)) { - _elm_genlist_fx_clear(obj); + _elm_genlist_fx_clear(obj, EINA_TRUE); return; } @@ -7595,11 +7528,16 @@ _elm_genlist_fx_play(Evas_Object *obj) { elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y); elm_transit_effect_color_add(fi->trans, 0, 0, 0, 0, 255, 255, 255, 255); + if ((!sd->pinch_zoom_mode) && (!sd->expanded_item)) + elm_transit_effect_zoom_add(fi->trans, 0.8, 1.0); } else if (fi->type == ELM_GEN_ITEM_FX_TYPE_DEL) { + _item_unhighlight(fi->it); elm_transit_effect_translation_add(fi->trans, fi->from.x, fi->from.y, fi->to.x, fi->to.y); elm_transit_effect_color_add(fi->trans, 255, 255, 255, 255, 0, 0, 0, 0); + if ((!sd->pinch_zoom_mode) && (!sd->expanded_item)) + elm_transit_effect_zoom_add(fi->trans, 1.0, 0.8); } elm_transit_effect_add(fi->trans, _item_fx_op, fi, _item_fx_done); elm_transit_del_cb_set(fi->trans, _item_fx_del_cb, fi); @@ -7622,7 +7560,8 @@ elm_genlist_pinch_zoom_mode_set(Evas_Object *obj, Elm_Gen_Pinch_Zoom_Mode mode) Elm_Gen_Item *it; Eina_Bool done = EINA_FALSE; - if ((sd->queue) || (!sd->rendered) || (sd->queue_idle_enterer)) return EINA_FALSE; + if ((sd->queue) || (!sd->rendered) + || (sd->queue_idle_enterer) || (!sd->fx_mode)) return EINA_FALSE; EINA_INLIST_FOREACH(sd->blocks, itb) {