summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/elementary/efl_ui_tab_bar.c182
-rw-r--r--src/lib/elementary/efl_ui_tab_bar.eo21
-rw-r--r--src/lib/elementary/efl_ui_tab_bar_private.h5
-rw-r--r--src/lib/elementary/efl_ui_tab_pager.c28
-rw-r--r--src/tests/elementary/spec/efl_test_pack_linear.c5
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 */