From ffafe749ed9c813696929262aacb61fd5af0ecc2 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Fri, 23 Aug 2019 18:20:32 +0200 Subject: [PATCH] efl_ui_tab_bar: migrate to Efl.Pack_Linear with pack linear it is a lot more convinient and error prover to add items to this widget, this also comes with the pack test suite, which verifies that this behaviour is not broken. Additionally we have fewer APIs that a user has to learn. Reviewed-by: WooHyun Jung Differential Revision: https://phab.enlightenment.org/D9730 --- src/lib/elementary/efl_ui_tab_bar.c | 188 +++++++++++------- src/lib/elementary/efl_ui_tab_bar.eo | 21 +- src/lib/elementary/efl_ui_tab_bar_private.h | 5 +- src/lib/elementary/efl_ui_tab_pager.c | 28 +-- .../elementary/spec/efl_test_pack_linear.c | 5 +- 5 files changed, 134 insertions(+), 113 deletions(-) diff --git a/src/lib/elementary/efl_ui_tab_bar.c b/src/lib/elementary/efl_ui_tab_bar.c index 30c5d31aa1..a988a56b21 100644 --- a/src/lib/elementary/efl_ui_tab_bar.c +++ b/src/lib/elementary/efl_ui_tab_bar.c @@ -18,12 +18,6 @@ _efl_ui_tab_bar_efl_ui_single_selectable_last_selected_get(const Eo *obj EINA_UN return pd->selected; } -EOLIAN static unsigned int -_efl_ui_tab_bar_tab_count(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd) -{ - return sd->cnt; -} - EOLIAN static void _efl_ui_tab_bar_efl_ui_single_selectable_fallback_selection_set(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd, Efl_Ui_Selectable *fallback) { @@ -91,65 +85,23 @@ EFL_CALLBACKS_ARRAY_DEFINE(item_listeners, static void _remove_item(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Ui_Item *item) { - pd->tab_infos = eina_list_remove(pd->tab_infos, item); - if (pd->selected == item) pd->selected = NULL; efl_event_callback_array_del(item, item_listeners(), obj); + if (efl_alive_get(item)) + _elm_widget_sub_object_redirect_to_top(obj, item); } -EOLIAN static void -_efl_ui_tab_bar_tab_add(Eo *obj, Efl_Ui_Tab_Bar_Data *sd, - int index, Efl_Ui_Tab_Bar_Default_Item *tab) +static Eina_Bool +_register_item(Eo *obj, Efl_Ui_Tab_Bar_Data *pd EINA_UNUSED, Eo *subitem) { - efl_ui_item_container_set(tab, obj); - efl_ui_widget_sub_object_add(obj, tab); - efl_event_callback_array_add(tab, item_listeners(), obj); - efl_gfx_hint_align_set(tab, EVAS_HINT_FILL, EVAS_HINT_FILL); - if (sd->cnt > index) - { - Efl_Ui_Item *existing_ti; - existing_ti = eina_list_nth(sd->tab_infos, index); - - sd->tab_infos = eina_list_prepend_relative(sd->tab_infos, tab, existing_ti); - evas_object_box_insert_before(sd->bx, tab, existing_ti); - } - else - { - sd->tab_infos = eina_list_append(sd->tab_infos, tab); - evas_object_box_append(sd->bx, tab); - } - - sd->cnt ++; -} - -EOLIAN static void -_efl_ui_tab_bar_tab_remove(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd, int index) -{ - if ((sd->cnt > 0) && (sd->cnt > index) && (index >= 0)) - { - Efl_Ui_Item *ti; - ti = eina_list_nth(sd->tab_infos, index); - - efl_del(ti); - } -} - -static void -_layout(Evas_Object *o, - Evas_Object_Box_Data *priv, - void *data) -{ - Evas_Object *obj = (Evas_Object *)data; - Eina_Bool horizontal; - - EFL_UI_TAB_BAR_DATA_GET(obj, sd); - - horizontal = efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE); - - _els_box_layout - (o, priv, horizontal, EINA_TRUE, efl_ui_mirrored_get(obj)); + EINA_SAFETY_ON_FALSE_RETURN_VAL(efl_isa(subitem, EFL_UI_TAB_BAR_DEFAULT_ITEM_CLASS), EINA_FALSE); + EINA_SAFETY_ON_FALSE_RETURN_VAL(efl_ui_widget_sub_object_add(obj, subitem), EINA_FALSE); + efl_ui_item_container_set(subitem, obj); + efl_event_callback_array_add(subitem, item_listeners(), obj); + efl_gfx_hint_align_set(subitem, EVAS_HINT_FILL, EVAS_HINT_FILL); + return EINA_TRUE; } EOLIAN static void @@ -168,24 +120,114 @@ _efl_ui_tab_bar_efl_object_constructor(Eo *obj, Efl_Ui_Tab_Bar_Data *sd) obj = efl_constructor(efl_super(obj, MY_CLASS)); - if (elm_widget_theme_object_set(obj, wd->resize_obj, - elm_widget_theme_klass_get(obj), - elm_widget_theme_element_get(obj), - elm_widget_theme_style_get(obj)) == EFL_UI_THEME_APPLY_ERROR_GENERIC) - CRI("Failed to set layout!"); + sd->bx = efl_add(EFL_UI_BOX_CLASS, obj); + efl_ui_box_homogeneous_set(sd->bx, EINA_TRUE); + efl_ui_layout_orientation_set(sd->bx, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL); + efl_ui_widget_internal_set(sd->bx, EINA_TRUE); - sd->dir = EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL; - sd->bx = evas_object_box_add(evas_object_evas_get(obj)); - evas_object_box_align_set(sd->bx, 0.5, 0.5); - evas_object_box_layout_set(sd->bx, _layout, obj, NULL); - - efl_ui_widget_focus_allow_set(obj, EINA_TRUE); - - efl_content_set(efl_part(obj, "efl.content"), sd->bx); - - sd->cnt = 0; + efl_composite_attach(obj, sd->bx); return obj; } +EOLIAN static Efl_Object* +_efl_ui_tab_bar_efl_object_finalize(Eo *obj, Efl_Ui_Tab_Bar_Data *pd) +{ + Eo *o = efl_finalize(efl_super(obj, MY_CLASS)); + + if (!o) return NULL; + + efl_content_set(efl_part(obj,"efl.content"), pd->bx); + + return o; +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_pack_clear(Eo *obj, Efl_Ui_Tab_Bar_Data *pd) +{ + for (int i = 0; i < efl_content_count(pd->bx); ++i) + { + _remove_item(obj, pd, efl_pack_content_get(pd->bx, i)); + } + return efl_pack_clear(pd->bx); +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_unpack_all(Eo *obj, Efl_Ui_Tab_Bar_Data *pd) +{ + for (int i = 0; i < efl_content_count(pd->bx); ++i) + { + _remove_item(obj, pd, efl_pack_content_get(pd->bx, i)); + } + return efl_pack_unpack_all(pd->bx); +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_unpack(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Gfx_Entity *subobj) +{ + _remove_item(obj, pd, subobj); + return efl_pack_unpack(pd->bx, subobj); +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_linear_pack_begin(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Gfx_Entity *subobj) +{ + EINA_SAFETY_ON_FALSE_RETURN_VAL(_register_item(obj, pd, subobj), EINA_FALSE); + return efl_pack_begin(pd->bx, subobj); +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_linear_pack_end(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Gfx_Entity *subobj) +{ + EINA_SAFETY_ON_FALSE_RETURN_VAL(_register_item(obj, pd, subobj), EINA_FALSE); + return efl_pack_end(pd->bx, subobj); +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_linear_pack_before(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Gfx_Entity *subobj, const Efl_Gfx_Entity *existing) +{ + EINA_SAFETY_ON_FALSE_RETURN_VAL(_register_item(obj, pd, subobj), EINA_FALSE); + return efl_pack_before(pd->bx, subobj, existing); +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_linear_pack_after(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Gfx_Entity *subobj, const Efl_Gfx_Entity *existing) +{ + EINA_SAFETY_ON_FALSE_RETURN_VAL(_register_item(obj, pd, subobj), EINA_FALSE); + return efl_pack_after(pd->bx, subobj, existing); +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_linear_pack_at(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Gfx_Entity *subobj, int index) +{ + EINA_SAFETY_ON_FALSE_RETURN_VAL(_register_item(obj, pd, subobj), EINA_FALSE); + return efl_pack_at(pd->bx, subobj, index); +} + +EOLIAN static int +_efl_ui_tab_bar_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd) +{ + return efl_content_count(pd->bx); +} + +EOLIAN static Eina_Iterator* +_efl_ui_tab_bar_efl_container_content_iterate(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd) +{ + return efl_content_iterate(pd->bx); +} + +EOLIAN static Efl_Gfx_Entity* +_efl_ui_tab_bar_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, int index) +{ + _remove_item(obj, pd, efl_pack_content_get(pd->bx, index)); + return efl_pack_unpack_at(pd->bx, index); +} + +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_pack(Eo *obj, Efl_Ui_Tab_Bar_Data *pd, Efl_Gfx_Entity *subobj) +{ + EINA_SAFETY_ON_FALSE_RETURN_VAL(_register_item(obj, pd, subobj), EINA_FALSE); + return efl_pack(pd->bx, subobj); +} + #include "efl_ui_tab_bar.eo.c" diff --git a/src/lib/elementary/efl_ui_tab_bar.eo b/src/lib/elementary/efl_ui_tab_bar.eo index f193dd2860..eff7281e22 100644 --- a/src/lib/elementary/efl_ui_tab_bar.eo +++ b/src/lib/elementary/efl_ui_tab_bar.eo @@ -1,24 +1,12 @@ -class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base implements Efl.Ui.Single_Selectable +class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base implements Efl.Ui.Single_Selectable, Efl.Pack_Linear { [[Tab Bar class]] methods { - tab_count @const { - return: uint; - } - tab_add @beta { - params { - @in index: int; - @in icon : Efl.Ui.Tab_Bar_Default_Item; - } - } - tab_remove @beta { - params { - @in index: int; - } - } + } implements { Efl.Object.constructor; + Efl.Object.finalize; Efl.Object.destructor; Efl.Ui.Single_Selectable.last_selected {get;} Efl.Ui.Single_Selectable.fallback_selection {get; set;} @@ -37,5 +25,8 @@ class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base implements Efl.Ui.Single_S } composite { Efl.Pack_Linear; + Efl.Pack; + Efl.Pack_Linear; + Efl.Container; } } diff --git a/src/lib/elementary/efl_ui_tab_bar_private.h b/src/lib/elementary/efl_ui_tab_bar_private.h index 82bf4b9c14..87763a9e87 100644 --- a/src/lib/elementary/efl_ui_tab_bar_private.h +++ b/src/lib/elementary/efl_ui_tab_bar_private.h @@ -5,10 +5,7 @@ typedef struct _Efl_Ui_Tab_Bar_Data Efl_Ui_Tab_Bar_Data; struct _Efl_Ui_Tab_Bar_Data { - Efl_Canvas_Object *bx; - int cnt; - Efl_Ui_Layout_Orientation dir; - Eina_List *tab_infos; + Efl_Ui_Box *bx; Efl_Ui_Item *selected, *fallback_selection; Eina_Bool in_value_change; }; diff --git a/src/lib/elementary/efl_ui_tab_pager.c b/src/lib/elementary/efl_ui_tab_pager.c index 6ce4c7f81b..b7299fce92 100644 --- a/src/lib/elementary/efl_ui_tab_pager.c +++ b/src/lib/elementary/efl_ui_tab_pager.c @@ -113,14 +113,12 @@ _efl_ui_tab_pager_efl_pack_pack_clear(Eo *obj, Efl_Ui_Tab_Pager_Data *sd) { Eo *subobj; Eina_List *l, *l_next; - int begin_index = 0; EINA_LIST_FOREACH_SAFE(sd->tab_pages, l, l_next, subobj) { sd->tab_pages = eina_list_remove(sd->tab_pages, subobj); sd->cnt--; - - efl_ui_tab_bar_tab_remove(sd->tab_bar, begin_index); } + efl_pack_clear(sd->tab_bar); efl_pack_clear(efl_super(obj, MY_CLASS)); return EINA_TRUE; @@ -135,14 +133,12 @@ _efl_ui_tab_pager_efl_pack_unpack_all(Eo *obj, Efl_Ui_Tab_Pager_Data *sd) { Eo *subobj; Eina_List *l, *l_next; - int begin_index = 0; EINA_LIST_FOREACH_SAFE(sd->tab_pages, l, l_next, subobj) { sd->tab_pages = eina_list_remove(sd->tab_pages, subobj); sd->cnt--; - - efl_ui_tab_bar_tab_remove(sd->tab_bar, begin_index); } + efl_pack_unpack_all(sd->tab_bar); efl_pack_unpack_all(efl_super(obj, MY_CLASS)); return EINA_TRUE; @@ -155,15 +151,12 @@ _efl_ui_tab_pager_efl_pack_unpack(Eo *obj, Efl_Ui_Tab_Pager_Data *sd, Efl_Gfx_En { if (sd->tab_bar) { - int index = eina_list_data_idx(sd->tab_pages, (void *)subobj); - sd->tab_pages = eina_list_remove(sd->tab_pages, subobj); sd->cnt--; - efl_ui_tab_bar_tab_remove(sd->tab_bar, index); + efl_pack_unpack(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj)); efl_pack_unpack(efl_super(obj, MY_CLASS), subobj); - return EINA_TRUE; } return EINA_FALSE; @@ -176,12 +169,11 @@ _efl_ui_tab_pager_efl_pack_linear_pack_begin(Eo *obj, { if (sd->tab_bar) { - int begin_index = 0; sd->tab_pages = eina_list_prepend(sd->tab_pages, subobj); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, begin_index, efl_ui_tab_page_tab_bar_item_get(subobj)); + efl_pack_begin(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj)); efl_pack_begin(efl_super(obj, MY_CLASS), subobj); sd->cur ++; @@ -198,12 +190,10 @@ _efl_ui_tab_pager_efl_pack_linear_pack_end(Eo *obj, { if (sd->tab_bar) { - int end_index = efl_ui_tab_bar_tab_count(sd->tab_bar); - sd->tab_pages = eina_list_append(sd->tab_pages, subobj); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, end_index, efl_ui_tab_page_tab_bar_item_get(subobj)); + efl_pack_end(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj)); efl_pack_end(efl_super(obj, MY_CLASS), subobj); return EINA_TRUE; @@ -224,7 +214,7 @@ _efl_ui_tab_pager_efl_pack_linear_pack_before(Eo *obj, sd->tab_pages = eina_list_prepend_relative(sd->tab_pages, subobj, existing); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, before_index, efl_ui_tab_page_tab_bar_item_get(subobj)); + efl_pack_before(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj), existing); efl_pack_before(efl_super(obj, MY_CLASS), subobj, existing); if (sd->cur >= before_index) sd->cur ++; @@ -247,7 +237,7 @@ _efl_ui_tab_pager_efl_pack_linear_pack_after(Eo *obj, sd->tab_pages = eina_list_append_relative(sd->tab_pages, subobj, existing); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, after_index, efl_ui_tab_page_tab_bar_item_get(subobj)); + efl_pack_after(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj), existing); efl_pack_after(efl_super(obj, MY_CLASS), subobj, existing); if (sd->cur > after_index) sd->cur ++; @@ -271,7 +261,7 @@ _efl_ui_tab_pager_efl_pack_linear_pack_at(Eo *obj, sd->tab_pages = eina_list_prepend_relative(sd->tab_pages, subobj, existing); sd->cnt ++; - efl_ui_tab_bar_tab_add(sd->tab_bar, index, efl_ui_tab_page_tab_bar_item_get(subobj)); + efl_pack_at(sd->tab_bar, efl_ui_tab_page_tab_bar_item_get(subobj), index); efl_pack_at(efl_super(obj, MY_CLASS), subobj, index); if (sd->cur >= index) sd->cur ++; @@ -293,7 +283,7 @@ _efl_ui_tab_pager_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Tab_Pager_Data sd->tab_pages = eina_list_remove(sd->tab_pages, existing); sd->cnt--; - efl_ui_tab_bar_tab_remove(sd->tab_bar, index); + efl_pack_unpack_at(sd->tab_bar, index); efl_pack_unpack_at(efl_super(obj, MY_CLASS), index); return existing; diff --git a/src/tests/elementary/spec/efl_test_pack_linear.c b/src/tests/elementary/spec/efl_test_pack_linear.c index eed26e6b5f..4747ec82b3 100644 --- a/src/tests/elementary/spec/efl_test_pack_linear.c +++ b/src/tests/elementary/spec/efl_test_pack_linear.c @@ -9,11 +9,12 @@ /* spec-meta-start {"test-interface":"Efl.Pack_Linear", - "test-widgets": ["Efl.Ui.Box", "Efl.Ui.Grid", "Efl.Ui.Spotlight.Container", "Efl.Ui.List", "Efl.Ui.Group_Item" ], + "test-widgets": ["Efl.Ui.Box", "Efl.Ui.Grid", "Efl.Ui.Spotlight.Container", "Efl.Ui.List", "Efl.Ui.Group_Item", "Efl.Ui.Tab_Bar"], "custom-mapping" : { "Efl.Ui.Grid" : "EFL_UI_GRID_DEFAULT_ITEM_CLASS", "Efl.Ui.List" : "EFL_UI_LIST_DEFAULT_ITEM_CLASS", - "Efl.Ui.Group_Item" : "EFL_UI_LIST_DEFAULT_ITEM_CLASS" + "Efl.Ui.Group_Item" : "EFL_UI_LIST_DEFAULT_ITEM_CLASS", + "Efl.Ui.Tab_Bar" : "EFL_UI_TAB_BAR_DEFAULT_ITEM_CLASS" } } spec-meta-end */