diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/elementary/efl_ui_tab_bar.c | 182 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_tab_bar.eo | 21 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_tab_bar_private.h | 5 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_tab_pager.c | 28 | ||||
-rw-r--r-- | src/tests/elementary/spec/efl_test_pack_linear.c | 5 |
5 files changed, 131 insertions, 110 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,101 +85,149 @@ 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) -{ - 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 ++; +static Eina_Bool +_register_item(Eo *obj, Efl_Ui_Tab_Bar_Data *pd EINA_UNUSED, Eo *subitem) +{ + 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 -_efl_ui_tab_bar_tab_remove(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *sd, int index) +_efl_ui_tab_bar_efl_object_destructor(Eo *obj, Efl_Ui_Tab_Bar_Data *sd EINA_UNUSED) { - if ((sd->cnt > 0) && (sd->cnt > index) && (index >= 0)) - { - Efl_Ui_Item *ti; - ti = eina_list_nth(sd->tab_infos, index); + efl_destructor(efl_super(obj, MY_CLASS)); +} - efl_del(ti); - } +EOLIAN static Efl_Object * +_efl_ui_tab_bar_efl_object_constructor(Eo *obj, Efl_Ui_Tab_Bar_Data *sd) +{ + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); + + if (!elm_widget_theme_klass_get(obj)) + elm_widget_theme_klass_set(obj, "tab_bar"); + + obj = efl_constructor(efl_super(obj, MY_CLASS)); + + 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); + + efl_composite_attach(obj, sd->bx); + + return obj; } -static void -_layout(Evas_Object *o, - Evas_Object_Box_Data *priv, - void *data) +EOLIAN static Efl_Object* +_efl_ui_tab_bar_efl_object_finalize(Eo *obj, Efl_Ui_Tab_Bar_Data *pd) { - Evas_Object *obj = (Evas_Object *)data; - Eina_Bool horizontal; + Eo *o = efl_finalize(efl_super(obj, MY_CLASS)); - EFL_UI_TAB_BAR_DATA_GET(obj, sd); + if (!o) return NULL; - horizontal = efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE); + efl_content_set(efl_part(obj,"efl.content"), pd->bx); - _els_box_layout - (o, priv, horizontal, EINA_TRUE, efl_ui_mirrored_get(obj)); + return o; } -EOLIAN static void -_efl_ui_tab_bar_efl_object_destructor(Eo *obj, Efl_Ui_Tab_Bar_Data *sd EINA_UNUSED) +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_pack_clear(Eo *obj, Efl_Ui_Tab_Bar_Data *pd) { - efl_destructor(efl_super(obj, MY_CLASS)); + 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 Efl_Object * -_efl_ui_tab_bar_efl_object_constructor(Eo *obj, Efl_Ui_Tab_Bar_Data *sd) +EOLIAN static Eina_Bool +_efl_ui_tab_bar_efl_pack_unpack_all(Eo *obj, Efl_Ui_Tab_Bar_Data *pd) { - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); + 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); +} - if (!elm_widget_theme_klass_get(obj)) - elm_widget_theme_klass_set(obj, "tab_bar"); +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); +} - obj = efl_constructor(efl_super(obj, MY_CLASS)); +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); +} - 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!"); +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); +} - 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); +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); +} - efl_ui_widget_focus_allow_set(obj, EINA_TRUE); +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); +} - efl_content_set(efl_part(obj, "efl.content"), sd->bx); +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); +} - sd->cnt = 0; +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); +} - return obj; +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 */ |