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 <woohyun0705@gmail.com>
Differential Revision: https://phab.enlightenment.org/D9730
This commit is contained in:
Marcel Hollerbach 2019-08-23 18:20:32 +02:00
parent 3c317618e5
commit ffafe749ed
5 changed files with 134 additions and 113 deletions

View File

@ -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"

View File

@ -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;
}
}

View File

@ -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;
};

View File

@ -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;

View File

@ -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 */