From 7e396432efef67f1348744bd7a822aa8f7843b64 Mon Sep 17 00:00:00 2001 From: Daniel Zaoui Date: Wed, 17 Sep 2014 16:44:05 +0300 Subject: [PATCH] Object Items: replace most of del_pre functions with destructor. This change is not simple because Elementary has not been built from the first day to work with Eo. Code had to be adapted to fit the new design. The del_pre that have not been replaced yet can return FALSE and prevent deletion. For these classes, code modification has to be deeper and will be done later. --- legacy/elementary/src/lib/elc_ctxpopup.c | 29 +++-- legacy/elementary/src/lib/elc_hoversel.c | 12 +- .../elementary/src/lib/elc_multibuttonentry.c | 8 +- legacy/elementary/src/lib/elc_naviframe.c | 15 ++- legacy/elementary/src/lib/elc_popup.c | 8 +- .../elementary/src/lib/elm_ctxpopup_item.eo | 2 +- legacy/elementary/src/lib/elm_diskselector.c | 87 ++++++++------ .../src/lib/elm_diskselector_item.eo | 2 +- legacy/elementary/src/lib/elm_flipselector.c | 109 +++--------------- .../src/lib/elm_flipselector_item.eo | 2 +- .../elementary/src/lib/elm_hoversel_item.eo | 2 +- legacy/elementary/src/lib/elm_index.c | 6 +- legacy/elementary/src/lib/elm_index_item.eo | 2 +- legacy/elementary/src/lib/elm_list.c | 1 + legacy/elementary/src/lib/elm_menu.c | 12 +- legacy/elementary/src/lib/elm_menu_item.eo | 2 +- .../src/lib/elm_multibuttonentry_item.eo | 2 +- .../elementary/src/lib/elm_naviframe_item.eo | 2 +- legacy/elementary/src/lib/elm_popup_item.eo | 2 +- .../elementary/src/lib/elm_segment_control.c | 8 +- .../src/lib/elm_segment_control_item.eo | 2 +- legacy/elementary/src/lib/elm_slideshow.c | 8 +- .../elementary/src/lib/elm_slideshow_item.eo | 2 +- legacy/elementary/src/lib/elm_toolbar.c | 6 +- legacy/elementary/src/lib/elm_toolbar_item.eo | 2 +- .../src/lib/elm_widget_flipselector.h | 1 - .../elementary/src/lib/elm_widget_naviframe.h | 2 - 27 files changed, 130 insertions(+), 206 deletions(-) diff --git a/legacy/elementary/src/lib/elc_ctxpopup.c b/legacy/elementary/src/lib/elc_ctxpopup.c index e3b714087a..cf2758d5a8 100644 --- a/legacy/elementary/src/lib/elc_ctxpopup.c +++ b/legacy/elementary/src/lib/elc_ctxpopup.c @@ -1030,9 +1030,9 @@ _list_del(Elm_Ctxpopup_Data *sd) ELM_SAFE_FREE(sd->list, evas_object_del); } -EOLIAN static Eina_Bool -_elm_ctxpopup_item_elm_widget_item_del_pre(Eo *eo_ctxpopup_it, - Elm_Ctxpopup_Item_Data *ctxpopup_it) +EOLIAN static void +_elm_ctxpopup_item_eo_base_destructor(Eo *eo_ctxpopup_it, + Elm_Ctxpopup_Item_Data *ctxpopup_it) { Evas_Object *list; @@ -1042,22 +1042,19 @@ _elm_ctxpopup_item_elm_widget_item_del_pre(Eo *eo_ctxpopup_it, list = elm_object_item_widget_get(ctxpopup_it->list_item); - if (eina_list_count(elm_list_items_get(list)) < 2) + if (ctxpopup_it->list_item) + eo_unref(ctxpopup_it->list_item); + sd->items = eina_list_remove(sd->items, eo_ctxpopup_it); + if (list && eina_list_count(elm_list_items_get(list)) < 2) { - if (ctxpopup_it->list_item) - elm_object_item_del(ctxpopup_it->list_item); - sd->items = eina_list_remove(sd->items, eo_ctxpopup_it); evas_object_hide(WIDGET(ctxpopup_it)); - - return EINA_TRUE; + } + else + { + if (sd->list_visible) elm_layout_sizing_eval(WIDGET(ctxpopup_it)); } - if (ctxpopup_it->list_item) - elm_object_item_del(ctxpopup_it->list_item); - sd->items = eina_list_remove(sd->items, eo_ctxpopup_it); - if (sd->list_visible) elm_layout_sizing_eval(WIDGET(ctxpopup_it)); - - return EINA_TRUE; + eo_do_super(eo_ctxpopup_it, ELM_CTXPOPUP_ITEM_CLASS, eo_destructor()); } EOLIAN static Eina_Bool @@ -1266,6 +1263,7 @@ _elm_ctxpopup_item_append(Eo *obj, Elm_Ctxpopup_Data *sd, const char *label, Eva item->list_item = elm_list_item_append(sd->list, label, icon, NULL, _item_wrap_cb, item); + eo_ref(item->list_item); sd->items = eina_list_append(sd->items, eo_item); if (sd->visible) elm_layout_sizing_eval(obj); @@ -1359,6 +1357,7 @@ _elm_ctxpopup_item_prepend(Eo *obj, Elm_Ctxpopup_Data *sd, const char *label, Ev item->list_item = elm_list_item_prepend(sd->list, label, icon, NULL, _item_wrap_cb, item); + eo_ref(item->list_item); sd->items = eina_list_prepend(sd->items, eo_item); if (sd->visible) elm_layout_sizing_eval(obj); diff --git a/legacy/elementary/src/lib/elc_hoversel.c b/legacy/elementary/src/lib/elc_hoversel.c index 7f80fea46b..f5602615ad 100644 --- a/legacy/elementary/src/lib/elc_hoversel.c +++ b/legacy/elementary/src/lib/elc_hoversel.c @@ -269,10 +269,10 @@ _elm_hoversel_item_elm_widget_item_style_get(Eo *eo_it EINA_UNUSED, return elm_object_style_get(VIEW(it)); } -EOLIAN static Eina_Bool -_elm_hoversel_item_elm_widget_item_del_pre(Eo *eo_item EINA_UNUSED, Elm_Hoversel_Item_Data *item) +EOLIAN static void +_elm_hoversel_item_eo_base_destructor(Eo *eo_item, Elm_Hoversel_Item_Data *item) { - ELM_HOVERSEL_DATA_GET_OR_RETURN_VAL(WIDGET(item), sd, EINA_FALSE); + ELM_HOVERSEL_DATA_GET_OR_RETURN(WIDGET(item), sd); elm_hoversel_hover_end(WIDGET(item)); sd->items = eina_list_remove(sd->items, eo_item); @@ -280,7 +280,7 @@ _elm_hoversel_item_elm_widget_item_del_pre(Eo *eo_item EINA_UNUSED, Elm_Hoversel eina_stringshare_del(item->icon_file); eina_stringshare_del(item->icon_group); - return EINA_TRUE; + eo_do_super(eo_item, ELM_HOVERSEL_ITEM_CLASS, eo_destructor()); } EOLIAN static void @@ -304,10 +304,6 @@ _elm_hoversel_evas_object_smart_del(Eo *obj, Elm_Hoversel_Data *sd) EINA_LIST_FREE(sd->items, eo_item) { - ELM_HOVERSEL_ITEM_DATA_GET(eo_item, item); - eina_stringshare_del(item->label); - eina_stringshare_del(item->icon_file); - eina_stringshare_del(item->icon_group); eo_del(eo_item); } elm_hoversel_hover_parent_set(obj, NULL); diff --git a/legacy/elementary/src/lib/elc_multibuttonentry.c b/legacy/elementary/src/lib/elc_multibuttonentry.c index a69adbdfe6..6d1703b081 100644 --- a/legacy/elementary/src/lib/elc_multibuttonentry.c +++ b/legacy/elementary/src/lib/elc_multibuttonentry.c @@ -586,13 +586,13 @@ _elm_multibuttonentry_item_elm_widget_item_part_text_get(Eo *eo_item EINA_UNUSED return edje_object_part_text_get(item->button, src_part); } -EOLIAN static Eina_Bool -_elm_multibuttonentry_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, - Elm_Multibuttonentry_Item_Data *it EINA_UNUSED) +EOLIAN static void +_elm_multibuttonentry_item_eo_base_destructor(Eo *eo_it, + Elm_Multibuttonentry_Item_Data *it) { _button_item_del(it); - return EINA_TRUE; + eo_do_super(eo_it, ELM_MULTIBUTTONENTRY_ITEM_CLASS, eo_destructor()); } static void diff --git a/legacy/elementary/src/lib/elc_naviframe.c b/legacy/elementary/src/lib/elc_naviframe.c index 2b4840bab9..abd6cdfcad 100644 --- a/legacy/elementary/src/lib/elc_naviframe.c +++ b/legacy/elementary/src/lib/elc_naviframe.c @@ -192,7 +192,7 @@ _item_free(Elm_Naviframe_Item_Data *it) if ((sd->preserve) && (!sd->on_deletion)) { /* so that elm does not delete the contents with the item's - * view after the del_pre_hook */ + * view after the destructor */ elm_object_part_content_unset(VIEW(it), CONTENT_PART); evas_object_event_callback_del (it->content, EVAS_CALLBACK_DEL, _item_content_del_cb); @@ -527,8 +527,8 @@ _elm_naviframe_item_elm_widget_item_part_text_get(Eo *nit EINA_UNUSED, return elm_object_part_text_get(VIEW(it), buf); } -EOLIAN static Eina_Bool -_elm_naviframe_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Naviframe_Item_Data *it) +EOLIAN static void +_elm_naviframe_item_eo_base_destructor(Eo *eo_item, Elm_Naviframe_Item_Data *it) { Elm_Naviframe_Item_Data *nit = it, *prev_it = NULL; Eina_Bool top; @@ -536,7 +536,6 @@ _elm_naviframe_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Naviframe_Item_Data ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd); nit->delete_me = EINA_TRUE; - if (nit->ref > 0) return EINA_FALSE; ecore_animator_del(nit->animator); @@ -569,7 +568,7 @@ _elm_naviframe_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Naviframe_Item_Data end: _item_free(nit); - return EINA_TRUE; + eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, eo_destructor()); } static void @@ -1664,10 +1663,10 @@ _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd) evas_object_ref(obj); if (it->pop_cb) { - it->ref++; + eo_ref(eo_item); if (!it->pop_cb(it->pop_data, eo_item)) { - it->ref--; + eo_unref(eo_item); if (it->delete_me) eo_do(eo_item, elm_wdg_item_del()); else @@ -1675,7 +1674,7 @@ _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd) evas_object_unref(obj); return NULL; } - it->ref--; + eo_unref(eo_item); } evas_object_unref(obj); diff --git a/legacy/elementary/src/lib/elc_popup.c b/legacy/elementary/src/lib/elc_popup.c index 2db91aae81..52f72095f1 100644 --- a/legacy/elementary/src/lib/elc_popup.c +++ b/legacy/elementary/src/lib/elc_popup.c @@ -766,10 +766,10 @@ _elm_popup_item_elm_widget_item_disable(Eo *eo_it, Elm_Popup_Item_Data *it) elm_layout_signal_emit(VIEW(it), "elm,state,item,enabled", "elm"); } -EOLIAN static Eina_Bool -_elm_popup_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, Elm_Popup_Item_Data *it) +EOLIAN static void +_elm_popup_item_eo_base_destructor(Eo *eo_it, Elm_Popup_Item_Data *it) { - ELM_POPUP_ITEM_CHECK_OR_RETURN(it, EINA_FALSE); + ELM_POPUP_ITEM_CHECK_OR_RETURN(it); ELM_POPUP_DATA_GET(WIDGET(it), sd); evas_object_del(it->icon); @@ -780,7 +780,7 @@ _elm_popup_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, Elm_Popup_Item_Da sd->items = NULL; _list_del(sd); } - return EINA_TRUE; + eo_do_super(eo_it, ELM_POPUP_ITEM_CLASS, eo_destructor()); } EOLIAN static void diff --git a/legacy/elementary/src/lib/elm_ctxpopup_item.eo b/legacy/elementary/src/lib/elm_ctxpopup_item.eo index 957cbbcaff..05b036f341 100644 --- a/legacy/elementary/src/lib/elm_ctxpopup_item.eo +++ b/legacy/elementary/src/lib/elm_ctxpopup_item.eo @@ -47,7 +47,7 @@ class Elm_Ctxpopup_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; - Elm_Widget_Item.del_pre; + Eo.Base.destructor; Elm_Widget_Item.disable; Elm_Widget_Item.signal_emit; Elm_Widget_Item.part_text.get; diff --git a/legacy/elementary/src/lib/elm_diskselector.c b/legacy/elementary/src/lib/elm_diskselector.c index 45d4b39dbe..376884539c 100644 --- a/legacy/elementary/src/lib/elm_diskselector.c +++ b/legacy/elementary/src/lib/elm_diskselector.c @@ -343,8 +343,8 @@ _sizing_eval(Evas_Object *obj) _resize_cb(NULL, NULL, obj, NULL); } -EOLIAN static Eina_Bool -_elm_diskselector_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, Elm_Diskselector_Item_Data *it) +EOLIAN static void +_elm_diskselector_item_eo_base_destructor(Eo *eo_it, Elm_Diskselector_Item_Data *it) { Elm_Diskselector_Item_Data *item2, *dit; Eina_List *l; @@ -360,6 +360,8 @@ _elm_diskselector_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, Elm_Diskse sd->r_items = eina_list_remove(sd->r_items, it); sd->items = eina_list_remove(sd->items, it); + sd->under_items = eina_list_remove(sd->under_items, it); + sd->over_items = eina_list_remove(sd->over_items, it); if (sd->selected_item == it) { @@ -378,10 +380,10 @@ _elm_diskselector_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, Elm_Diskse { if (!sd->item_count) { - evas_object_hide(sd->VIEW(first)); - evas_object_hide(sd->VIEW(second)); - evas_object_hide(sd->VIEW(last)); - evas_object_hide(sd->VIEW(s_last)); + if (sd->first) evas_object_hide(sd->VIEW(first)); + if (sd->second) evas_object_hide(sd->VIEW(second)); + if (sd->last) evas_object_hide(sd->VIEW(last)); + if (sd->s_last) evas_object_hide(sd->VIEW(s_last)); EINA_LIST_FOREACH(sd->under_items, l, item2) evas_object_hide(VIEW(item2)); @@ -394,23 +396,30 @@ _elm_diskselector_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, Elm_Diskse dit = eina_list_nth(sd->items, 0); if (dit) { - eina_stringshare_replace(&sd->first->label, dit->label); - edje_object_part_text_escaped_set - (sd->VIEW(first), "elm.text", sd->first->label); + if (sd->first) + { + eina_stringshare_replace(&sd->first->label, dit->label); + edje_object_part_text_escaped_set + (sd->VIEW(first), "elm.text", sd->first->label); + } } dit = eina_list_nth(sd->items, 1); if (dit) { - eina_stringshare_replace(&sd->second->label, dit->label); - edje_object_part_text_escaped_set - (sd->VIEW(second), "elm.text", sd->second->label); + if (sd->second) + { + eina_stringshare_replace(&sd->second->label, dit->label); + edje_object_part_text_escaped_set + (sd->VIEW(second), "elm.text", sd->second->label); + } } // if more than 3 itmes should be displayed for (i = 2; i < CEIL(sd->display_item_num); i++) { dit = eina_list_nth(sd->items, i); item2 = eina_list_nth(sd->over_items, i - 2); + if (!dit || !item2) continue; eina_stringshare_replace(&item2->label, dit->label); edje_object_part_text_escaped_set (VIEW(item2), "elm.text", item2->label); @@ -419,23 +428,30 @@ _elm_diskselector_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, Elm_Diskse dit = eina_list_nth(sd->items, eina_list_count(sd->items) - 1); if (dit) { - eina_stringshare_replace(&sd->last->label, dit->label); - edje_object_part_text_escaped_set - (sd->VIEW(last), "elm.text", sd->last->label); + if (sd->last) + { + eina_stringshare_replace(&sd->last->label, dit->label); + edje_object_part_text_escaped_set + (sd->VIEW(last), "elm.text", sd->last->label); + } } dit = eina_list_nth(sd->items, eina_list_count(sd->items) - 2); if (dit) { - eina_stringshare_replace(&sd->s_last->label, dit->label); - edje_object_part_text_escaped_set - (sd->VIEW(s_last), "elm.text", sd->s_last->label); + if (sd->s_last) + { + eina_stringshare_replace(&sd->s_last->label, dit->label); + edje_object_part_text_escaped_set + (sd->VIEW(s_last), "elm.text", sd->s_last->label); + } } // if more than 3 itmes should be displayed for (i = 3; i <= CEIL(sd->display_item_num); i++) { dit = eina_list_nth(sd->items, sd->item_count - i); item2 = eina_list_nth(sd->under_items, i - 3); + if (!dit || !item2) continue; eina_stringshare_replace(&item2->label, dit->label); edje_object_part_text_escaped_set (VIEW(item2), "elm.text", item2->label); @@ -449,7 +465,7 @@ _elm_diskselector_item_elm_widget_item_del_pre(Eo *eo_it EINA_UNUSED, Elm_Diskse _sizing_eval(obj); - return EINA_TRUE; + eo_do_super(eo_it, ELM_DISKSELECTOR_ITEM_CLASS, eo_destructor()); } EOLIAN static void @@ -1098,14 +1114,10 @@ _scroll_drag_stop_cb(Evas_Object *obj, } static void -_round_item_del(Elm_Diskselector_Data *sd, +_round_item_del(Elm_Diskselector_Data *sd EINA_UNUSED, Elm_Diskselector_Item_Data *it) { if (!it) return; - - elm_box_unpack(sd->main_box, VIEW(it)); - sd->r_items = eina_list_remove(sd->r_items, it); - eina_stringshare_del(it->label); eo_del(EO_OBJ(it)); } @@ -1318,70 +1330,70 @@ EOLIAN static void _elm_diskselector_evas_object_smart_del(Eo *obj, Elm_Diskselector_Data *sd) { Elm_Diskselector_Item_Data *it; - Eina_List *l; + Eina_List *l, *l2; Evas_Object *blank; /* left blank */ - EINA_LIST_FOREACH (sd->left_blanks, l, blank) + EINA_LIST_FREE (sd->left_blanks, blank) evas_object_del(blank); /* right blank */ - EINA_LIST_FOREACH (sd->right_blanks, l, blank) + EINA_LIST_FREE (sd->right_blanks, blank) evas_object_del(blank); if (sd->last) { - eina_stringshare_del(sd->last->label); evas_object_del(sd->VIEW(last)); eo_del(EO_OBJ(sd->last)); + sd->last = NULL; } if (sd->s_last) { - eina_stringshare_del(sd->s_last->label); evas_object_del(sd->VIEW(s_last)); eo_del(EO_OBJ(sd->s_last)); + sd->s_last = NULL; } if (sd->second) { - eina_stringshare_del(sd->second->label); evas_object_del(sd->VIEW(second)); eo_del(EO_OBJ(sd->second)); + sd->second = NULL; } if (sd->first) { - eina_stringshare_del(sd->first->label); evas_object_del(sd->VIEW(first)); eo_del(EO_OBJ(sd->first)); + sd->first = NULL; } - EINA_LIST_FOREACH(sd->under_items, l, it) + EINA_LIST_FOREACH_SAFE(sd->under_items, l, l2, it) { if (it) { - eina_stringshare_del(it->label); evas_object_del(VIEW(it)); eo_del(EO_OBJ(it)); } } + sd->under_items = eina_list_free(sd->under_items); - EINA_LIST_FOREACH(sd->over_items, l, it) + EINA_LIST_FOREACH_SAFE(sd->over_items, l, l2, it) { if (it) { - eina_stringshare_del(it->label); evas_object_del(VIEW(it)); eo_del(EO_OBJ(it)); } } + sd->over_items = eina_list_free(sd->over_items); - EINA_LIST_FREE(sd->items, it) + EINA_LIST_FOREACH_SAFE(sd->items, l, l2, it) { - _item_del(it); eo_del(EO_OBJ(it)); } + sd->items = eina_list_free(sd->items); sd->r_items = eina_list_free(sd->r_items); ELM_SAFE_FREE(sd->scroller_move_idle_enterer, ecore_idle_enterer_del); @@ -1605,7 +1617,6 @@ _elm_diskselector_clear(Eo *obj, Elm_Diskselector_Data *sd) sd->selected_item = NULL; EINA_LIST_FREE(sd->items, it) { - _item_del(it); eo_del(EO_OBJ(it)); } diff --git a/legacy/elementary/src/lib/elm_diskselector_item.eo b/legacy/elementary/src/lib/elm_diskselector_item.eo index 3df81dabd7..84e63f2424 100644 --- a/legacy/elementary/src/lib/elm_diskselector_item.eo +++ b/legacy/elementary/src/lib/elm_diskselector_item.eo @@ -95,7 +95,7 @@ class Elm_Diskselector_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; - Elm_Widget_Item.del_pre; + Eo.Base.destructor; Elm_Widget_Item.part_text.get; Elm_Widget_Item.part_text.set; Elm_Widget_Item.part_content.get; diff --git a/legacy/elementary/src/lib/elm_flipselector.c b/legacy/elementary/src/lib/elm_flipselector.c index c45a19eb32..bae9231f01 100644 --- a/legacy/elementary/src/lib/elm_flipselector.c +++ b/legacy/elementary/src/lib/elm_flipselector.c @@ -205,49 +205,6 @@ _sentinel_eval(Elm_Flipselector_Data *sd) } } -/* TODO: create a flag to avoid looping here all times */ -static void -_flipselector_process_deletions(Elm_Flipselector_Data *sd) -{ - Eina_List *l; - Elm_Object_Item *eo_item; - Eina_Bool skip = EINA_TRUE; - Eina_Bool sentinel_eval = EINA_FALSE; - - sd->walking++; /* avoid nested deletions */ - - EINA_LIST_FOREACH(sd->items, l, eo_item) - { - ELM_FLIPSELECTOR_ITEM_DATA_GET(eo_item, item); - if (!item->deleted) continue; - - if (sd->current == l) - { - if (sd->current == sd->sentinel) sentinel_eval = EINA_TRUE; - sd->current = eina_list_prev(sd->current); - } - sd->items = eina_list_remove(sd->items, eo_item); - - if (!sd->current) sd->current = sd->items; - - eo_do(eo_item, elm_wdg_item_del()); - skip = EINA_FALSE; - - if (eina_list_count(sd->items) <= 1) - elm_layout_signal_emit - (sd->obj, "elm,state,button,hidden", "elm"); - else - elm_layout_signal_emit - (sd->obj, "elm,state,button,visible", "elm"); - } - - if (!skip) _update_view(sd->obj); - - if (sentinel_eval) _sentinel_eval(sd); - - sd->walking--; -} - static inline void _flipselector_unwalk(Elm_Flipselector_Data *sd) { @@ -259,8 +216,6 @@ _flipselector_unwalk(Elm_Flipselector_Data *sd) sd->walking = 0; } if (sd->walking) return; - - _flipselector_process_deletions(sd); } static void @@ -275,9 +230,8 @@ _on_item_changed(Elm_Flipselector_Data *sd) if (item->func) item->func((void *)WIDGET_ITEM_DATA_GET(EO_OBJ(item)), WIDGET(item), eo_item); - if (!item->deleted) - evas_object_smart_callback_call - (sd->obj, SIG_SELECTED, eo_item); + evas_object_smart_callback_call + (sd->obj, SIG_SELECTED, eo_item); } static void @@ -296,22 +250,14 @@ _send_msg(Elm_Flipselector_Data *sd, _on_item_changed(sd); } -EOLIAN static Eina_Bool -_elm_flipselector_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Flipselector_Item_Data *item) +EOLIAN static void +_elm_flipselector_item_eo_base_destructor(Eo *eo_item, Elm_Flipselector_Item_Data *item) { Elm_Object_Item *eo_item2; Eina_List *l; ELM_FLIPSELECTOR_DATA_GET(WIDGET(item), sd); - if (sd->walking > 0) - { - item->deleted = EINA_TRUE; - return EINA_FALSE; - } - - _flipselector_walk(sd); - EINA_LIST_FOREACH(sd->items, l, eo_item2) { if (eo_item2 == eo_item) @@ -333,11 +279,18 @@ _elm_flipselector_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Flipselector_Ite } } + if (eina_list_count(sd->items) <= 1) + elm_layout_signal_emit + (sd->obj, "elm,state,button,hidden", "elm"); + else + elm_layout_signal_emit + (sd->obj, "elm,state,button,visible", "elm"); + eina_stringshare_del(item->label); _sentinel_eval(sd); - _flipselector_unwalk(sd); + _update_view(sd->obj); - return EINA_TRUE; + eo_do_super(eo_item, ELM_FLIPSELECTOR_ITEM_CLASS, eo_destructor()); } EOLIAN static void @@ -709,36 +662,13 @@ _elm_flipselector_items_get(Eo *obj EINA_UNUSED, Elm_Flipselector_Data *sd) EOLIAN static Elm_Object_Item* _elm_flipselector_first_item_get(Eo *obj EINA_UNUSED, Elm_Flipselector_Data *sd) { - Elm_Object_Item *eo_item; - Eina_List *l; - - if (!sd->items) return NULL; - - EINA_LIST_FOREACH(sd->items, l, eo_item) - { - ELM_FLIPSELECTOR_ITEM_DATA_GET(eo_item, it); - if (it->deleted) continue; - return eo_item; - } - - return NULL; + return eina_list_data_get(sd->items); } EOLIAN static Elm_Object_Item* _elm_flipselector_last_item_get(Eo *obj EINA_UNUSED, Elm_Flipselector_Data *sd) { - Elm_Object_Item *eo_item; - Eina_List *l; - - if (!sd->items) return NULL; - - EINA_LIST_REVERSE_FOREACH(sd->items, l, eo_item) - { - ELM_FLIPSELECTOR_ITEM_DATA_GET(eo_item, item); - if (item->deleted) continue; - return eo_item; - } - return NULL; + return eina_list_last_data_get(sd->items); } EOLIAN static Elm_Object_Item* @@ -768,12 +698,9 @@ _elm_flipselector_item_selected_set(Eo *eo_item, EINA_LIST_FOREACH(sd->items, l, _eo_item) { ELM_FLIPSELECTOR_ITEM_DATA_GET(_eo_item, _item); - if (!_item->deleted) - { - sd->current = l; - _send_msg(sd, MSG_FLIP_UP, (char *)_item->label); - break; - } + sd->current = l; + _send_msg(sd, MSG_FLIP_UP, (char *)_item->label); + break; } _flipselector_unwalk(sd); return; diff --git a/legacy/elementary/src/lib/elm_flipselector_item.eo b/legacy/elementary/src/lib/elm_flipselector_item.eo index b9101b353c..431da94253 100644 --- a/legacy/elementary/src/lib/elm_flipselector_item.eo +++ b/legacy/elementary/src/lib/elm_flipselector_item.eo @@ -65,7 +65,7 @@ class Elm_Flipselector_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; - Elm_Widget_Item.del_pre; + Eo.Base.destructor; Elm_Widget_Item.signal_emit; Elm_Widget_Item.part_text.get; Elm_Widget_Item.part_text.set; diff --git a/legacy/elementary/src/lib/elm_hoversel_item.eo b/legacy/elementary/src/lib/elm_hoversel_item.eo index 729264b11a..97d78fdd1d 100644 --- a/legacy/elementary/src/lib/elm_hoversel_item.eo +++ b/legacy/elementary/src/lib/elm_hoversel_item.eo @@ -35,8 +35,8 @@ class Elm_Hoversel_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; + Eo.Base.destructor; Elm_Widget_Item.signal_emit; - Elm_Widget_Item.del_pre; Elm_Widget_Item.part_text.get; Elm_Widget_Item.style.get; Elm_Widget_Item.style.set; diff --git a/legacy/elementary/src/lib/elm_index.c b/legacy/elementary/src/lib/elm_index.c index c9ac287615..3c9bb24acc 100644 --- a/legacy/elementary/src/lib/elm_index.c +++ b/legacy/elementary/src/lib/elm_index.c @@ -424,15 +424,15 @@ _elm_index_elm_layout_sizing_eval(Eo *obj, Elm_Index_Data *_pd EINA_UNUSED) evas_object_size_hint_max_set(obj, -1, -1); } -EOLIAN static Eina_Bool -_elm_index_item_elm_widget_item_del_pre(Eo *eo_item EINA_UNUSED, Elm_Index_Item_Data *it) +EOLIAN static void +_elm_index_item_eo_base_destructor(Eo *eo_item EINA_UNUSED, Elm_Index_Item_Data *it) { ELM_INDEX_DATA_GET(WIDGET(it), sd); _item_free(it); _index_box_clear(WIDGET(it), sd->level); - return EINA_TRUE; + eo_do_super(eo_item, ELM_INDEX_ITEM_CLASS, eo_destructor()); } EOLIAN static void diff --git a/legacy/elementary/src/lib/elm_index_item.eo b/legacy/elementary/src/lib/elm_index_item.eo index a99a898d3b..fe88f6024f 100644 --- a/legacy/elementary/src/lib/elm_index_item.eo +++ b/legacy/elementary/src/lib/elm_index_item.eo @@ -40,7 +40,7 @@ class Elm_Index_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; + Eo.Base.destructor; Elm_Widget_Item.access_register; - Elm_Widget_Item.del_pre; } } diff --git a/legacy/elementary/src/lib/elm_list.c b/legacy/elementary/src/lib/elm_list.c index 3cbf451bc7..8a746a744b 100644 --- a/legacy/elementary/src/lib/elm_list.c +++ b/legacy/elementary/src/lib/elm_list.c @@ -2367,6 +2367,7 @@ _elm_list_evas_object_smart_del(Eo *obj, Elm_List_Data *sd) ELM_LIST_ITEM_DATA_GET(eo_it, it); /* issuing free because of "locking" item del pre hook */ _elm_list_item_free(it); + WIDGET(it) = NULL; eo_del(EO_OBJ(it)); } diff --git a/legacy/elementary/src/lib/elm_menu.c b/legacy/elementary/src/lib/elm_menu.c index e568c68fa5..7bcf352ac7 100644 --- a/legacy/elementary/src/lib/elm_menu.c +++ b/legacy/elementary/src/lib/elm_menu.c @@ -52,11 +52,6 @@ _item_del(Elm_Object_Item *eo_item) _item_del(child); eina_list_free(item->submenu.items); - eina_stringshare_del(item->label); - evas_object_del(item->submenu.hv); - evas_object_del(item->submenu.location); - eina_stringshare_del(item->icon_str); - eo_del(eo_item); } @@ -961,13 +956,14 @@ _elm_menu_item_add_helper(Evas_Object *obj, _sizing_eval(obj); } -EOLIAN static Eina_Bool -_elm_menu_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Menu_Item_Data *item) +EOLIAN static void +_elm_menu_item_eo_base_destructor(Eo *eo_item, Elm_Menu_Item_Data *item) { ELM_MENU_DATA_GET(WIDGET(item), sd); elm_menu_item_subitems_clear(eo_item); eina_stringshare_del(item->label); + eina_stringshare_del(item->icon_str); evas_object_del(item->content); evas_object_del(item->submenu.hv); evas_object_del(item->submenu.location); @@ -981,7 +977,7 @@ _elm_menu_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Menu_Item_Data *item) if (sd->dbus_menu) _elm_dbus_menu_item_delete(sd->dbus_menu, item->dbus_idx); - return EINA_TRUE; + eo_do_super(eo_item, ELM_MENU_ITEM_CLASS, eo_destructor()); } EOLIAN static void diff --git a/legacy/elementary/src/lib/elm_menu_item.eo b/legacy/elementary/src/lib/elm_menu_item.eo index 92eda75435..68eb136061 100644 --- a/legacy/elementary/src/lib/elm_menu_item.eo +++ b/legacy/elementary/src/lib/elm_menu_item.eo @@ -122,7 +122,7 @@ class Elm_Menu_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; - Elm_Widget_Item.del_pre; + Eo.Base.destructor; Elm_Widget_Item.disable; Elm_Widget_Item.signal_emit; Elm_Widget_Item.part_text.get; diff --git a/legacy/elementary/src/lib/elm_multibuttonentry_item.eo b/legacy/elementary/src/lib/elm_multibuttonentry_item.eo index 2e42fc8f06..5f05b0d5c5 100644 --- a/legacy/elementary/src/lib/elm_multibuttonentry_item.eo +++ b/legacy/elementary/src/lib/elm_multibuttonentry_item.eo @@ -46,7 +46,7 @@ class Elm_Multibuttonentry_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; - Elm_Widget_Item.del_pre; + Eo.Base.destructor; Elm_Widget_Item.signal_emit; Elm_Widget_Item.part_text.get; Elm_Widget_Item.part_text.set; diff --git a/legacy/elementary/src/lib/elm_naviframe_item.eo b/legacy/elementary/src/lib/elm_naviframe_item.eo index e84b5b9418..6090d53ac0 100644 --- a/legacy/elementary/src/lib/elm_naviframe_item.eo +++ b/legacy/elementary/src/lib/elm_naviframe_item.eo @@ -99,7 +99,7 @@ class Elm_Naviframe_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; - Elm_Widget_Item.del_pre; + Eo.Base.destructor; Elm_Widget_Item.signal_emit; Elm_Widget_Item.part_text.set; Elm_Widget_Item.part_text.get; diff --git a/legacy/elementary/src/lib/elm_popup_item.eo b/legacy/elementary/src/lib/elm_popup_item.eo index cfdc57b5be..bf7ffe3b17 100644 --- a/legacy/elementary/src/lib/elm_popup_item.eo +++ b/legacy/elementary/src/lib/elm_popup_item.eo @@ -3,7 +3,7 @@ class Elm_Popup_Item(Elm_Widget_Item) eo_prefix: elm_obj_popup_item; implements { Eo.Base.constructor; - Elm_Widget_Item.del_pre; + Eo.Base.destructor; Elm_Widget_Item.disable; Elm_Widget_Item.signal_emit; Elm_Widget_Item.part_text.get; diff --git a/legacy/elementary/src/lib/elm_segment_control.c b/legacy/elementary/src/lib/elm_segment_control.c index 801253c41d..99a329f970 100644 --- a/legacy/elementary/src/lib/elm_segment_control.c +++ b/legacy/elementary/src/lib/elm_segment_control.c @@ -489,15 +489,15 @@ _elm_segment_control_item_elm_widget_item_part_content_get(Eo *eo_item EINA_UNUS return edje_object_part_swallow_get(VIEW(item), part); } -static Eina_Bool -_elm_segment_control_item_elm_widget_item_del_pre(Eo *eo_item EINA_UNUSED, Elm_Segment_Control_Item_Data *item) +EOLIAN static void +_elm_segment_control_item_eo_base_destructor(Eo *eo_item, Elm_Segment_Control_Item_Data *item) { ELM_SEGMENT_CONTROL_DATA_GET(WIDGET(item), sd); _item_free(item); _update_list(sd); - return EINA_TRUE; + eo_do_super(eo_item, ELM_SEGMENT_CONTROL_ITEM_CLASS, eo_destructor()); } static char * @@ -628,8 +628,6 @@ _elm_segment_control_evas_object_smart_del(Eo *obj, Elm_Segment_Control_Data *sd EINA_LIST_FREE(sd->items, eo_it) { - ELM_SEGMENT_ITEM_DATA_GET(eo_it, it); - _item_free(it); eo_del(eo_it); } diff --git a/legacy/elementary/src/lib/elm_segment_control_item.eo b/legacy/elementary/src/lib/elm_segment_control_item.eo index 0d4d7f228e..317ef2b442 100644 --- a/legacy/elementary/src/lib/elm_segment_control_item.eo +++ b/legacy/elementary/src/lib/elm_segment_control_item.eo @@ -54,11 +54,11 @@ class Elm_Segment_Control_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; + Eo.Base.destructor; Elm_Widget_Item.access_register; Elm_Widget_Item.part_text.get; Elm_Widget_Item.part_text.set; Elm_Widget_Item.part_content.get; Elm_Widget_Item.part_content.set; - Elm_Widget_Item.del_pre; } } diff --git a/legacy/elementary/src/lib/elm_slideshow.c b/legacy/elementary/src/lib/elm_slideshow.c index 0f950f7085..d2a943dbd9 100644 --- a/legacy/elementary/src/lib/elm_slideshow.c +++ b/legacy/elementary/src/lib/elm_slideshow.c @@ -285,10 +285,10 @@ _timer_cb(void *data) return ECORE_CALLBACK_CANCEL; } -EOLIAN static Eina_Bool -_elm_slideshow_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Slideshow_Item_Data *item) +EOLIAN static void +_elm_slideshow_item_eo_base_destructor(Eo *eo_item, Elm_Slideshow_Item_Data *item) { - ELM_SLIDESHOW_DATA_GET_OR_RETURN_VAL(WIDGET(item), sd, EINA_FALSE); + ELM_SLIDESHOW_DATA_GET_OR_RETURN(WIDGET(item), sd); if (sd->previous == item) sd->previous = NULL; if (sd->current == item) @@ -312,7 +312,7 @@ _elm_slideshow_item_elm_widget_item_del_pre(Eo *eo_item, Elm_Slideshow_Item_Data if ((VIEW(item)) && (item->itc->func.del)) item->itc->func.del(elm_object_item_data_get(eo_item), VIEW(item)); - return EINA_TRUE; + eo_do_super(eo_item, ELM_SLIDESHOW_ITEM_CLASS, eo_destructor()); } EOLIAN static void diff --git a/legacy/elementary/src/lib/elm_slideshow_item.eo b/legacy/elementary/src/lib/elm_slideshow_item.eo index ffe6c59f50..609d60e321 100644 --- a/legacy/elementary/src/lib/elm_slideshow_item.eo +++ b/legacy/elementary/src/lib/elm_slideshow_item.eo @@ -36,6 +36,6 @@ class Elm_Slideshow_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; - Elm_Widget_Item.del_pre; + Eo.Base.destructor; } } diff --git a/legacy/elementary/src/lib/elm_toolbar.c b/legacy/elementary/src/lib/elm_toolbar.c index 2a019fc2bd..2bfdeb381b 100644 --- a/legacy/elementary/src/lib/elm_toolbar.c +++ b/legacy/elementary/src/lib/elm_toolbar.c @@ -2219,8 +2219,8 @@ _access_state_cb(void *data, Evas_Object *obj EINA_UNUSED) return NULL; } -EOLIAN static Eina_Bool -_elm_toolbar_item_elm_widget_item_del_pre(Eo *eo_item EINA_UNUSED, Elm_Toolbar_Item_Data *item) +EOLIAN static void +_elm_toolbar_item_eo_base_destructor(Eo *eo_item, Elm_Toolbar_Item_Data *item) { Elm_Toolbar_Item_Data *next = NULL; Evas_Object *obj; @@ -2248,7 +2248,7 @@ _elm_toolbar_item_elm_widget_item_del_pre(Eo *eo_item EINA_UNUSED, Elm_Toolbar_I if (item != sd->more_item) eo_do(obj, elm_obj_widget_theme_apply()); - return EINA_TRUE; + eo_do_super(eo_item, ELM_TOOLBAR_ITEM_CLASS, eo_destructor()); } static void diff --git a/legacy/elementary/src/lib/elm_toolbar_item.eo b/legacy/elementary/src/lib/elm_toolbar_item.eo index b3c9105993..9d0e8028a0 100644 --- a/legacy/elementary/src/lib/elm_toolbar_item.eo +++ b/legacy/elementary/src/lib/elm_toolbar_item.eo @@ -415,8 +415,8 @@ class Elm_Toolbar_Item(Elm_Widget_Item) } implements { Eo.Base.constructor; + Eo.Base.destructor; Elm_Widget_Item.disable; - Elm_Widget_Item.del_pre; Elm_Widget_Item.focus.set; Elm_Widget_Item.focus.get; Elm_Widget_Item.part_text.get; diff --git a/legacy/elementary/src/lib/elm_widget_flipselector.h b/legacy/elementary/src/lib/elm_widget_flipselector.h index b482feffd2..ef2edef2ce 100644 --- a/legacy/elementary/src/lib/elm_widget_flipselector.h +++ b/legacy/elementary/src/lib/elm_widget_flipselector.h @@ -48,7 +48,6 @@ struct _Elm_Flipselector_Item_Data const char *label; Evas_Smart_Cb func; - int deleted : 1; }; #define ELM_FLIPSELECTOR_DATA_GET(o, sd) \ diff --git a/legacy/elementary/src/lib/elm_widget_naviframe.h b/legacy/elementary/src/lib/elm_widget_naviframe.h index bcfea5b2e5..684d148636 100644 --- a/legacy/elementary/src/lib/elm_widget_naviframe.h +++ b/legacy/elementary/src/lib/elm_widget_naviframe.h @@ -60,8 +60,6 @@ struct _Elm_Naviframe_Item_Data Evas_Coord minw; Evas_Coord minh; - int ref; - Eina_Bool title_enabled : 1; Eina_Bool popping : 1; /**< a flag to notify the item is on poping. this flag is set true at the start of item pop. */ Eina_Bool delete_me : 1; /**< a flag to notify the item is on deletion. this flag is set true at the start of item deletion. */