jpeg pushed a commit to branch master.

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

commit 3c40ebb99887ba4c74c40e4509c49cc675877886
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Tue Mar 29 13:30:13 2016 +0900

    elm: Replace contents list by iterators
    
    This introduces two new methods:
    - content_names_iterate
    - content_objects_iterate
    
    Replacing:
    - elm_layout_content_swallow_list_get
---
 src/lib/elementary/elc_popup.c      | 18 ++++----
 src/lib/elementary/elm_container.eo | 20 ++++----
 src/lib/elementary/elm_layout.c     | 91 +++++++++++++++++++++++++++++++++----
 src/lib/elementary/elm_layout.eo    |  3 +-
 4 files changed, 105 insertions(+), 27 deletions(-)

diff --git a/src/lib/elementary/elc_popup.c b/src/lib/elementary/elc_popup.c
index 9afea65..9ee09a8 100644
--- a/src/lib/elementary/elc_popup.c
+++ b/src/lib/elementary/elc_popup.c
@@ -1366,7 +1366,7 @@ _elm_popup_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Popup_Data *sd, Elm_Fo
 {
    Evas_Object *ao;
    Eina_List *items = NULL;
-   Eina_List *base_items = NULL;
+   Eina_Iterator *base_it;
 
    /* access */
    if (_elm_config->access_mode)
@@ -1381,9 +1381,10 @@ _elm_popup_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Popup_Data *sd, Elm_Fo
         if (ao) items = eina_list_append(items, ao);
      }
 
-   base_items = elm_obj_container_content_swallow_list_get(sd->main_layout);
-
-   items = eina_list_merge(items, base_items);
+   base_it = elm_obj_container_content_objects_iterate(sd->main_layout);
+   EINA_ITERATOR_FOREACH(base_it, ao)
+     if (ao) items = eina_list_append(items, ao);
+   eina_iterator_free(base_it);
 
    if (!elm_widget_focus_list_next_get(sd->main_layout, items, 
eina_list_data_get, dir, next, next_item))
      *next = sd->main_layout;
@@ -1403,7 +1404,7 @@ _elm_popup_elm_widget_focus_direction(Eo *obj 
EINA_UNUSED, Elm_Popup_Data *sd, c
 {
    Evas_Object *ao;
    Eina_List *items = NULL;
-   Eina_List *base_items = NULL;
+   Eina_Iterator *base_it;
 
    /* access */
    if (_elm_config->access_mode)
@@ -1418,9 +1419,10 @@ _elm_popup_elm_widget_focus_direction(Eo *obj 
EINA_UNUSED, Elm_Popup_Data *sd, c
         if (ao) items = eina_list_append(items, ao);
      }
 
-   base_items = elm_obj_container_content_swallow_list_get(sd->main_layout);
-
-   items = eina_list_merge(items, base_items);
+   base_it = elm_obj_container_content_objects_iterate(sd->main_layout);
+   EINA_ITERATOR_FOREACH(base_it, ao)
+     if (ao) items = eina_list_append(items, ao);
+   eina_iterator_free(base_it);
 
    elm_widget_focus_list_direction_get
      (sd->main_layout, base, items, eina_list_data_get, degree, direction, 
direction_item, weight);
diff --git a/src/lib/elementary/elm_container.eo 
b/src/lib/elementary/elm_container.eo
index 94c0d37..5ea444c 100644
--- a/src/lib/elementary/elm_container.eo
+++ b/src/lib/elementary/elm_container.eo
@@ -4,14 +4,6 @@ class Elm.Container (Elm.Widget)
    eo_prefix: elm_obj_container;
    data: null;
    methods {
-      @property content_swallow_list {
-         get {
-            [[Get the list of swallow parts in the object.]]
-         }
-         values {
-            ret: free(own(list<Evas.Object *> *), eina_list_free); [[list]]
-         }
-      }
       @property content {
          [[Swallowed sub-object contained in this object.]]
          set {
@@ -32,12 +24,22 @@ class Elm.Container (Elm.Widget)
          }
          return: Evas.Object *;
       }
+      content_names_iterate {
+         [[Returns an iterator on all parts in this container that currently
+           hold a sub-object.]]
+         return: free(own(iterator<const(char)*> *), eina_iterator_free);
+      }
+      content_objects_iterate {
+         [[Returns an iterator on all swallowed objects in this container.]]
+         return: free(own(iterator<Evas.Object*> *), eina_iterator_free);
+      }
    }
    implements {
       @virtual .content_unset;
       @virtual .content.get;
       @virtual .content.set;
-      @virtual .content_swallow_list.get;
+      @virtual .content_names_iterate;
+      @virtual .content_objects_iterate;
    }
 
 }
diff --git a/src/lib/elementary/elm_layout.c b/src/lib/elementary/elm_layout.c
index 8058b83..ab40c98 100644
--- a/src/lib/elementary/elm_layout.c
+++ b/src/lib/elementary/elm_layout.c
@@ -51,6 +51,14 @@ static const char *_elm_layout_swallow_parts[] = {
  * should not be messed up by inhering classes */
 typedef struct _Elm_Layout_Sub_Object_Data   Elm_Layout_Sub_Object_Data;
 typedef struct _Elm_Layout_Sub_Object_Cursor Elm_Layout_Sub_Object_Cursor;
+typedef struct _Elm_Layout_Sub_Iterator      Elm_Layout_Sub_Iterator;
+
+struct _Elm_Layout_Sub_Iterator
+{
+   Eina_Iterator  iterator;
+   Eina_Iterator *real_iterator;
+   Elm_Layout    *object;
+};
 
 struct _Elm_Layout_Sub_Object_Data
 {
@@ -1115,21 +1123,14 @@ _elm_layout_elm_container_content_unset(Eo *obj, 
Elm_Layout_Smart_Data *sd, cons
    return NULL;
 }
 
+/* legacy only - eo is iterator */
 EAPI Eina_List *
 elm_layout_content_swallow_list_get(const Evas_Object *obj)
 {
    ELM_LAYOUT_CHECK(obj) NULL;
    Eina_List *ret = NULL;
-   ret = elm_obj_container_content_swallow_list_get(obj);
-   return ret;
-}
-
-EOLIAN static Eina_List*
-_elm_layout_elm_container_content_swallow_list_get(Eo *obj EINA_UNUSED, 
Elm_Layout_Smart_Data *sd)
-{
-   Eina_List *ret = NULL;
-
    Elm_Layout_Sub_Object_Data *sub_d = NULL;
+   Elm_Layout_Smart_Data *sd = eo_data_scope_get(obj, MY_CLASS);
    Eina_List *l = NULL;
 
    EINA_LIST_FOREACH(sd->subs, l, sub_d)
@@ -1141,6 +1142,78 @@ _elm_layout_elm_container_content_swallow_list_get(Eo 
*obj EINA_UNUSED, Elm_Layo
    return ret;
 }
 
+static Eina_Bool
+_names_iterator_next(Elm_Layout_Sub_Iterator *it, void **data)
+{
+   Elm_Layout_Sub_Object_Data *sub;
+
+   if (!eina_iterator_next(it->real_iterator, (void **)&sub))
+     return EINA_FALSE;
+
+   if (data) *data = (void*) sub->part;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_objects_iterator_next(Elm_Layout_Sub_Iterator *it, void **data)
+{
+   Elm_Layout_Sub_Object_Data *sub;
+
+   if (!eina_iterator_next(it->real_iterator, (void **)&sub))
+     return EINA_FALSE;
+
+   if (data) *data = sub->obj;
+   return EINA_TRUE;
+}
+
+static Elm_Layout *
+_sub_iterator_get_container(Elm_Layout_Sub_Iterator *it)
+{
+   return it->object;
+}
+
+static void
+_sub_iterator_free(Elm_Layout_Sub_Iterator *it)
+{
+   eina_iterator_free(it->real_iterator);
+   free(it);
+}
+
+static Eina_Iterator *
+_sub_iterator_create(Elm_Layout_Smart_Data *sd, Eina_Bool objects)
+{
+   Elm_Layout_Sub_Iterator *it;
+
+   it = calloc(1, sizeof(*it));
+   if (!it) return NULL;
+
+   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+   it->real_iterator = eina_list_iterator_new(sd->subs);
+   it->iterator.version = EINA_ITERATOR_VERSION;
+   it->iterator.get_container = 
FUNC_ITERATOR_GET_CONTAINER(_sub_iterator_get_container);
+   it->iterator.free = FUNC_ITERATOR_FREE(_sub_iterator_free);
+
+   if (objects)
+     it->iterator.next = FUNC_ITERATOR_NEXT(_objects_iterator_next);
+   else
+     it->iterator.next = FUNC_ITERATOR_NEXT(_names_iterator_next);
+
+   return &it->iterator;
+}
+
+EOLIAN static Eina_Iterator *
+_elm_layout_elm_container_content_names_iterate(Eo *eo_obj EINA_UNUSED, 
Elm_Layout_Smart_Data *sd)
+{
+   return _sub_iterator_create(sd, EINA_FALSE);
+}
+
+EOLIAN static Eina_Iterator *
+_elm_layout_elm_container_content_objects_iterate(Eo *eo_obj EINA_UNUSED, 
Elm_Layout_Smart_Data *sd)
+{
+   return _sub_iterator_create(sd, EINA_TRUE);
+}
+
 EOLIAN static Eina_Bool
 _elm_layout_text_set(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, 
const char *text)
 {
diff --git a/src/lib/elementary/elm_layout.eo b/src/lib/elementary/elm_layout.eo
index 5d2f89d..d1f79f5 100644
--- a/src/lib/elementary/elm_layout.eo
+++ b/src/lib/elementary/elm_layout.eo
@@ -490,7 +490,8 @@ class Elm.Layout (Elm.Container, Efl.File)
       Elm.Container.content.get;
       Elm.Container.content.set;
       Elm.Container.content_unset;
-      Elm.Container.content_swallow_list.get;
+      Elm.Container.content_names_iterate;
+      Elm.Container.content_objects_iterate;
    }
    events {
       theme,changed;

-- 


Reply via email to