forked from enlightenment/efl
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:
parent
3c317618e5
commit
ffafe749ed
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue