bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=ffafe749ed9c813696929262aacb61fd5af0ecc2

commit ffafe749ed9c813696929262aacb61fd5af0ecc2
Author: Marcel Hollerbach <m...@marcel-hollerbach.de>
Date:   Fri Aug 23 18:20:32 2019 +0200

    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 <woohyun0...@gmail.com>
    Differential Revision: https://phab.enlightenment.org/D9730
---
 src/lib/elementary/efl_ui_tab_bar.c              | 182 ++++++++++++++---------
 src/lib/elementary/efl_ui_tab_bar.eo             |  21 +--
 src/lib/elementary/efl_ui_tab_bar_private.h      |   5 +-
 src/lib/elementary/efl_ui_tab_pager.c            |  28 ++--
 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 */

-- 


Reply via email to