summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcel Hollerbach <mail@marcel-hollerbach.de>2019-08-23 18:20:32 +0200
committerMarcel Hollerbach <mail@marcel-hollerbach.de>2019-08-29 14:42:43 +0200
commitffafe749ed9c813696929262aacb61fd5af0ecc2 (patch)
treef6f5bccd65ac43105cf43dab694b406b73a3b3af /src
parent3c317618e53cd74746fd6e8923091e4a073845f5 (diff)
downloadefl-ffafe749ed9c813696929262aacb61fd5af0ecc2.tar.gz
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
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 */