efl_ui_list_view: Hide SegArray and PreciseLayouter
authorLarry Lira <larry@expertisesolutions.com.br>
Thu, 24 Jan 2019 13:29:28 +0000 (22:29 +0900)
committerTaehyub Kim <taehyub.kim@samsung.com>
Thu, 31 Jan 2019 01:53:43 +0000 (10:53 +0900)
Summary:
Changed seg_array eolian class to struct
Changed PreciseLayouter and Relayout to private eolian
Removed relayout set/get in Efl.Ui.List.View

Reviewers: cedric, felipealmeida, SanghyeonLee

Reviewed By: cedric, felipealmeida, SanghyeonLee

Subscribers: #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D7724

12 files changed:
src/Makefile_Elementary.am
src/lib/elementary/Elementary.h
src/lib/elementary/efl_ui_list_view.c
src/lib/elementary/efl_ui_list_view.eo
src/lib/elementary/efl_ui_list_view_model.eo
src/lib/elementary/efl_ui_list_view_precise_layouter.c
src/lib/elementary/efl_ui_list_view_relayout.eo
src/lib/elementary/efl_ui_list_view_seg_array.c
src/lib/elementary/efl_ui_list_view_seg_array.eo [deleted file]
src/lib/elementary/efl_ui_list_view_seg_array.h
src/lib/elementary/efl_ui_list_view_types.eot
src/lib/elementary/meson.build

index 7e901f3..f4a9ed3 100644 (file)
@@ -81,8 +81,6 @@ elm_public_eolian_files = \
        lib/elementary/efl_ui_list_view.eo \
        lib/elementary/efl_ui_list_view_model.eo \
        lib/elementary/efl_ui_list_view_pan.eo \
-       lib/elementary/efl_ui_list_view_seg_array.eo \
-       lib/elementary/efl_ui_list_view_relayout.eo \
        lib/elementary/efl_ui_item.eo \
        lib/elementary/efl_ui_list_item.eo \
        lib/elementary/efl_ui_list_default_item_part_icon.eo \
@@ -177,6 +175,8 @@ elm_private_eolian_files = \
        tests/elementary/focus_test_sub_main.eo \
        lib/elementary/efl_ui_selection_manager.eo \
        lib/elementary/efl_datetime_manager.eo \
+       lib/elementary/efl_ui_list_view_relayout.eo \
+       lib/elementary/efl_ui_list_view_precise_layouter.eo \
        $(NULL)
 
 ## TIZEN_ONLY(20180509): support elementary optional build
@@ -296,7 +296,6 @@ elm_legacy_eolian_files = \
        lib/elementary/elm_slideshow_item.eo \
        lib/elementary/elm_table.eo \
        lib/elementary/elm_thumb.eo \
-       lib/elementary/efl_ui_list_view_precise_layouter.eo \
        $(NULL)
 
 elm_eolian_type_files = \
index e3fe40a..ca93e77 100644 (file)
@@ -355,7 +355,6 @@ EAPI void efl_ui_focus_relation_free(Efl_Ui_Focus_Relations *rel);
 # include <efl_ui_grid.eo.h>
 # include <efl_ui_list_view_types.eot.h>
 # include <efl_ui_list_view_seg_array.h>
-# include <efl_ui_list_view_seg_array.eo.h>
 # include <efl_ui_list_view_model.eo.h>
 # include <efl_ui_list_view_relayout.eo.h>
 # include <efl_ui_list_view.eo.h>
index 57ff394..efa3e82 100644 (file)
@@ -674,7 +674,7 @@ _efl_ui_list_view_efl_object_constructor(Eo *obj, Efl_Ui_List_View_Data *pd)
    evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
    efl_access_object_role_set(obj, EFL_ACCESS_ROLE_LIST);
 
-   pd->seg_array = efl_new(EFL_UI_LIST_VIEW_SEG_ARRAY_CLASS, efl_ui_list_view_seg_array_setup(efl_added, 32));
+   pd->seg_array = efl_ui_list_view_seg_array_setup(32);
 
    efl_event_callback_add(obj, EFL_UI_FOCUS_MANAGER_EVENT_FOCUS_CHANGED, _list_element_focused, NULL);
 
@@ -702,8 +702,7 @@ _efl_ui_list_view_efl_object_destructor(Eo *obj, Efl_Ui_List_View_Data *pd)
    efl_replace(&pd->relayout, NULL);
    efl_replace(&pd->factory, NULL);
 
-   efl_ui_list_view_seg_array_flush(pd->seg_array);
-   efl_unref(pd->seg_array);
+   efl_ui_list_view_seg_array_free(pd->seg_array);
 
    eina_stringshare_del(pd->style);
    efl_destructor(efl_super(obj, MY_CLASS));
@@ -830,19 +829,6 @@ _efl_ui_list_view_item_select_set(Efl_Ui_List_View_Layout_Item *item, Eina_Bool
    eina_stringshare_del(sprop);
 }
 
-static void
-_efl_ui_list_view_relayout_set(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED, Efl_Ui_List_View_Relayout *object)
-{
-   if (efl_replace(&pd->relayout, object) && pd->model && pd->relayout)
-     efl_ui_list_view_relayout_model_set(pd->relayout, pd->model);
-}
-
-static Efl_Ui_List_View_Relayout *
-_efl_ui_list_view_relayout_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED)
-{
-   return pd->relayout;
-}
-
 static Eina_Value
 _children_slice_then(void * data, const Eina_Value v, const Eina_Future *dead_future EINA_UNUSED)
 {
index 48bb72b..2828756 100644 (file)
@@ -11,11 +11,6 @@ class Efl.Ui.List_View extends Efl.Ui.Layout implements Efl.Ui.Scrollable_Intera
                 Efl.Ui.Clickable, Efl.Ui.Selectable, Efl.Ui.List_View_Model, Efl.Ui.Widget_Focus_Manager
 {
    methods {
-      @property relayout {
-         values {
-            object: Efl.Ui.List_View_Relayout;
-         }
-      }
       @property homogeneous {
          get {
            [[Get whether the homogeneous mode is enabled.]]
@@ -83,12 +78,8 @@ class Efl.Ui.List_View extends Efl.Ui.Layout implements Efl.Ui.Scrollable_Intera
       Efl.Ui.Focus.Composition.prepare;
       Efl.Ui.View.model { get; set; }
 
-//      Efl.Ui.Scrollable_Interactive.scroll;
       Efl.Layout.Signal.signal_callback_add;
       Efl.Layout.Signal.signal_callback_del;
-//      Elm.Interface.Atspi_Accessible.children { get; }
-//      Elm.Interface.Atspi_Widget.Action.elm_actions { get; }
-//      Efl.Access.Widget.Action.elm_actions { get; }
       Efl.Access.Object.access_children { get; }
       Efl.Access.Selection.selected_children_count { get; }
       Efl.Access.Selection.selected_child { get; }
index 0a511e2..f01fee8 100644 (file)
@@ -21,13 +21,6 @@ interface Efl.Ui.List_View_Model extends Efl.Interface
             item: ptr(Efl.Ui.List_View_Layout_Item);
          }
       }
-      // @property visible_range {
-      //    set {}
-      //    values {
-      //       first: int;
-      //       count: int;
-      //    }
-      // }
       @property model_size {
          get {}
          values {
index c6cd605..5693152 100644 (file)
@@ -353,7 +353,7 @@ _initilize(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Precise_Layouter_Data *pd, Efl_
    pd->recalc = EINA_TRUE;
    pd->initialized = EINA_TRUE;
 
-   efl_replace(&pd->seg_array, seg_array);
+   pd->seg_array = seg_array;
 
    efl_ui_list_view_model_load_range_set(pd->modeler, 0, pd->count_total); // load all
    efl_event_callback_add(pd->model, EFL_MODEL_EVENT_CHILD_ADDED, _child_added_cb, pd);
@@ -400,7 +400,7 @@ _finalize(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Precise_Layouter_Data *pd)
         efl_ui_list_view_model_min_size_set(pd->modeler, pd->min);
      }
 
-   efl_replace(&pd->seg_array, NULL);
+   pd->seg_array = NULL;
    efl_replace(&pd->modeler, NULL);
 
    pd->initialized = EINA_FALSE;
index 52cd23d..4e27340 100644 (file)
@@ -1,3 +1,5 @@
+type @extern Efl_Ui_List_View_Seg_Array:  __undefined_type;
+
 interface Efl.Ui.List_View_Relayout extends Efl.Interface
 {
    methods {
@@ -5,7 +7,7 @@ interface Efl.Ui.List_View_Relayout extends Efl.Interface
          params {
             modeler: Efl.Ui.List_View_Model;
             first: int;
-            children: Efl.Ui.List_View_Seg_Array;
+            children: ptr(Efl_Ui_List_View_Seg_Array);
          }
       }
       content_created {
index 8c6c0ed..8bf39e9 100644 (file)
@@ -5,13 +5,11 @@
 #include <Efl.h>
 #include <assert.h>
 
-#define MY_CLASS EFL_UI_LIST_VIEW_SEG_ARRAY_CLASS
-#define MY_CLASS_NAME "Efl.Ui.List_View_Seg_Array"
-
 #include "efl_ui_list_view_private.h"
 #include "efl_ui_list_view_seg_array.h"
 
-static int _search_lookup_cb(Eina_Rbtree const* rbtree, const void* key, int length EINA_UNUSED, void* data EINA_UNUSED)
+static int
+_search_lookup_cb(Eina_Rbtree const* rbtree, const void* key, int length EINA_UNUSED, void* data EINA_UNUSED)
 {
   Efl_Ui_List_View_Seg_Array_Node const* node = (void const*)rbtree;
   int index = *(int*)key;
@@ -29,7 +27,8 @@ static int _search_lookup_cb(Eina_Rbtree const* rbtree, const void* key, int len
     }
 }
 
-static int _insert_lookup_cb(Eina_Rbtree const* rbtree, const void* key, int length EINA_UNUSED, void* data EINA_UNUSED)
+static int
+_insert_lookup_cb(Eina_Rbtree const* rbtree, const void* key, int length EINA_UNUSED, void* data EINA_UNUSED)
 {
   Efl_Ui_List_View_Seg_Array_Node const* node = (void const*)rbtree;
   int index = *(int*)key;
@@ -47,7 +46,8 @@ static int _insert_lookup_cb(Eina_Rbtree const* rbtree, const void* key, int len
     }
 }
 
-static Eina_Rbtree_Direction _rbtree_compare(Efl_Ui_List_View_Seg_Array_Node const* left,
+static Eina_Rbtree_Direction
+_rbtree_compare(Efl_Ui_List_View_Seg_Array_Node const* left,
                                              Efl_Ui_List_View_Seg_Array_Node const* right, void* data EINA_UNUSED)
 {
   if(left->first < right->first)
@@ -73,7 +73,7 @@ _free_node(Efl_Ui_List_View_Seg_Array_Node* node, void* data EINA_UNUSED)
 }
 
 static Efl_Ui_List_View_Seg_Array_Node*
-_alloc_node(Efl_Ui_List_View_Seg_Array_Data* pd, int first)
+_alloc_node(Efl_Ui_List_View_Seg_Array* pd, int first)
 {
    Efl_Ui_List_View_Seg_Array_Node* node;
    node = calloc(1, sizeof(Efl_Ui_List_View_Seg_Array_Node) + pd->step_size*sizeof(Efl_Ui_List_View_Layout_Item*));
@@ -85,25 +85,16 @@ _alloc_node(Efl_Ui_List_View_Seg_Array_Data* pd, int first)
    return node;
 }
 
-EOLIAN static void
-_efl_ui_list_view_seg_array_flush(Eo* obj EINA_UNUSED, Efl_Ui_List_View_Seg_Array_Data *pd)
-{
-   if (pd->root)
-     eina_rbtree_delete(EINA_RBTREE_GET(pd->root), EINA_RBTREE_FREE_CB(_free_node), NULL);
-
-   pd->root = NULL;
-   pd->node_count = 0;
-   pd->count = 0;
-}
-
-static Efl_Ui_List_View_Layout_Item* _create_item_partial(Efl_Model* model)
+static Efl_Ui_List_View_Layout_Item*
+_create_item_partial(Efl_Model* model)
 {
    Efl_Ui_List_View_Layout_Item* item = calloc(1, sizeof(Efl_Ui_List_View_Layout_Item));
    item->children = efl_ref(model);
    return item;
 }
 
-static Efl_Ui_List_View_Layout_Item* _create_item(Efl_Model* model, Efl_Ui_List_View_Seg_Array_Node* node, unsigned int index)
+static Efl_Ui_List_View_Layout_Item*
+_create_item(Efl_Model* model, Efl_Ui_List_View_Seg_Array_Node* node, unsigned int index)
 {
    Efl_Ui_List_View_Layout_Item* item =  _create_item_partial(model);
    item->index_offset = index - node->first;
@@ -111,43 +102,9 @@ static Efl_Ui_List_View_Layout_Item* _create_item(Efl_Model* model, Efl_Ui_List_
    return item;
 }
 
-EOLIAN static Efl_Ui_List_View_Layout_Item*
-_efl_ui_list_view_seg_array_remove(Eo* obj EINA_UNUSED, Efl_Ui_List_View_Seg_Array_Data *pd, int index)
-{
-   Efl_Ui_List_View_Seg_Array_Node *node;
-   Efl_Ui_List_View_Layout_Item *item, *rt;
-   Eina_Iterator* iterator;
-   int offset;
-
-   node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(pd->root),
-                                        &index, sizeof(index), &_insert_lookup_cb, NULL);
-   if (!node) return NULL;
-
-   offset = index - node->first;
-   if (offset >= node->length) return NULL;
-
-   rt = node->pointers[offset];
-   pd->count--;
-   node->length--;
-
-   while (offset < node->length)
-     {
-       node->pointers[offset] = node->pointers[offset+1];
-       item = node->pointers[offset];
-       --item->index_offset;
-       ++offset;
-     }
-
-   node = (void*)EINA_RBTREE_GET(node)->son[EINA_RBTREE_LEFT];
-   iterator = eina_rbtree_iterator_infix((void*)node);
-   while(eina_iterator_next(iterator, (void**)&node))
-     node->first--;
-
-   return rt;
-}
-
 static void
-_efl_ui_list_view_seg_array_insert_at_node(Efl_Ui_List_View_Seg_Array_Data* pd, int index, Efl_Ui_List_View_Layout_Item* item, Efl_Ui_List_View_Seg_Array_Node* node)
+_efl_ui_list_view_seg_array_insert_at_node(Efl_Ui_List_View_Seg_Array* pd, int index,
+                            Efl_Ui_List_View_Layout_Item* item, Efl_Ui_List_View_Seg_Array_Node* node)
 {
    Eina_Iterator* iterator;
    int pos;
@@ -193,83 +150,28 @@ _efl_ui_list_view_seg_array_insert_at_node(Efl_Ui_List_View_Seg_Array_Data* pd,
    eina_iterator_free(iterator);
 }
 
-
-EOLIAN static void
-_efl_ui_list_view_seg_array_insert(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Seg_Array_Data* pd, int index, Efl_Model* model)
-{
-  Efl_Ui_List_View_Seg_Array_Node* node, *next;
-  Efl_Ui_List_View_Layout_Item* item;
-
-  item = _create_item_partial(model);
-
-  node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(pd->root),
-                                          &index, sizeof(index), &_insert_lookup_cb, NULL);
-  if(node)
-    {
-      next = (void*)EINA_RBTREE_GET(node)->son[EINA_RBTREE_LEFT];
-      if(next && next->first <= index)
-        _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, next);
-      else
-        _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, node);
-    }
-  else
-    _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, NULL);
-}
-
 static void
-efl_ui_list_view_seg_array_insert_object(Efl_Ui_List_View_Seg_Array_Data *seg_array, unsigned int index, Efl_Model *children)
+_efl_ui_list_view_seg_array_insert_object(Efl_Ui_List_View_Seg_Array *pd, unsigned int index, Efl_Model *children)
 {
    Efl_Ui_List_View_Seg_Array_Node *node;
 
-   node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(seg_array->root),
+   node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(pd->root),
                                            &index, sizeof(index), &_insert_lookup_cb, NULL);
    if (!node)
      {
-        node = _alloc_node(seg_array, index);
+        node = _alloc_node(pd, index);
      }
 
    assert(node->length < node->max);
    node->pointers[node->length] = _create_item(children, node, index);
    node->length++;
-   seg_array->count++;
-}
-
-EOLIAN static void
-_efl_ui_list_view_seg_array_insert_value(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Seg_Array_Data *seg_array, int first, Eina_Value v)
-{
-   Efl_Model *children;
-   unsigned int i, len;
-
-   if (eina_value_type_get(&v) == EINA_VALUE_TYPE_OBJECT)
-     {
-        children = eina_value_object_get(&v);
-        efl_ui_list_view_seg_array_insert_object(seg_array, first, children);
-     }
-   else if (eina_value_type_get(&v) == EINA_VALUE_TYPE_ARRAY)
-     {
-        EINA_VALUE_ARRAY_FOREACH(&v, len, i, children)
-          {
-             unsigned int idx = first + i;
-
-             efl_ui_list_view_seg_array_insert_object(seg_array, idx, children);
-          }
-     }
-   else
-     {
-        printf("Unknow type !\n");
-     }
-}
-
-EOLIAN static int
-_efl_ui_list_view_seg_array_count(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Seg_Array_Data* pd)
-{
-   return pd->count;
+   pd->count++;
 }
 
 typedef struct _Efl_Ui_List_View_Segarray_Eina_Accessor
 {
    Eina_Accessor vtable;
-   Efl_Ui_List_View_Seg_Array_Data* seg_array;
+   Efl_Ui_List_View_Seg_Array* seg_array;
 } Efl_Ui_List_View_Segarray_Eina_Accessor;
 
 static Eina_Bool
@@ -289,30 +191,6 @@ _efl_ui_list_view_seg_array_accessor_get_at(Efl_Ui_List_View_Segarray_Eina_Acces
    return EINA_FALSE;
 }
 
-EOLIAN static void
-_efl_ui_list_view_seg_array_setup(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Seg_Array_Data *pd, int size)
-{
-   pd->step_size = size;
-}
-
-EOLIAN static Eo *
-_efl_ui_list_view_seg_array_efl_object_constructor(Eo *obj, Efl_Ui_List_View_Seg_Array_Data *pd EINA_UNUSED)
-{
-   obj = efl_constructor(efl_super(obj, MY_CLASS));
-
-   return obj;
-}
-
-EOLIAN static void
-_efl_ui_list_view_seg_array_efl_object_destructor(Eo *obj, Efl_Ui_List_View_Seg_Array_Data *pd)
-{
-   if (pd->root)
-     eina_rbtree_delete(EINA_RBTREE_GET(pd->root), EINA_RBTREE_FREE_CB(_free_node), NULL);
-
-   pd->root = NULL;
-   efl_destructor(efl_super(obj, MY_CLASS));
-}
-
 static void*
 _efl_ui_list_view_seg_array_accessor_get_container(Efl_Ui_List_View_Segarray_Eina_Accessor* acc EINA_UNUSED)
 {
@@ -344,7 +222,7 @@ _efl_ui_list_view_seg_array_accessor_clone(Efl_Ui_List_View_Segarray_Eina_Access
 }
 
 static void
-_efl_ui_list_view_seg_array_accessor_setup(Efl_Ui_List_View_Segarray_Eina_Accessor* acc, Efl_Ui_List_View_Seg_Array_Data* seg_array)
+_efl_ui_list_view_seg_array_accessor_setup(Efl_Ui_List_View_Segarray_Eina_Accessor* acc, Efl_Ui_List_View_Seg_Array* seg_array)
 {
    EINA_MAGIC_SET(&acc->vtable, EINA_MAGIC_ACCESSOR);
    acc->vtable.version = EINA_ACCESSOR_VERSION;
@@ -357,18 +235,10 @@ _efl_ui_list_view_seg_array_accessor_setup(Efl_Ui_List_View_Segarray_Eina_Access
    acc->seg_array = seg_array;
 }
 
-EOLIAN static Eina_Accessor*
-_efl_ui_list_view_seg_array_accessor_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Seg_Array_Data* pd)
-{
-   Efl_Ui_List_View_Segarray_Eina_Accessor* acc = calloc(1, sizeof(Efl_Ui_List_View_Segarray_Eina_Accessor));
-   _efl_ui_list_view_seg_array_accessor_setup(acc, pd);
-   return &acc->vtable;
-}
-
 typedef struct _Efl_Ui_List_View_Segarray_Node_Accessor
 {
    Eina_Accessor vtable;
-   Efl_Ui_List_View_Seg_Array_Data* seg_array;
+   Efl_Ui_List_View_Seg_Array* seg_array;
    Eina_Iterator* pre_iterator;
    Efl_Ui_List_View_Seg_Array_Node* current_node;
    int current_index;
@@ -442,7 +312,7 @@ _efl_ui_list_view_seg_array_node_accessor_clone(Efl_Ui_List_View_Segarray_Node_A
 }
 
 static void
-_efl_ui_list_view_seg_array_node_accessor_setup(Efl_Ui_List_View_Segarray_Node_Accessor* acc, Efl_Ui_List_View_Seg_Array_Data* seg_array)
+_efl_ui_list_view_seg_array_node_accessor_setup(Efl_Ui_List_View_Segarray_Node_Accessor* acc, Efl_Ui_List_View_Seg_Array* seg_array)
 {
    EINA_MAGIC_SET(&acc->vtable, EINA_MAGIC_ACCESSOR);
    acc->vtable.version = EINA_ACCESSOR_VERSION;
@@ -458,18 +328,147 @@ _efl_ui_list_view_seg_array_node_accessor_setup(Efl_Ui_List_View_Segarray_Node_A
    acc->current_node = NULL;
 }
 
-EOLIAN static Eina_Accessor*
-_efl_ui_list_view_seg_array_node_accessor_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Seg_Array_Data* pd)
+/* External Functions */
+
+Efl_Ui_List_View_Seg_Array *
+efl_ui_list_view_seg_array_setup(int size)
+{
+   Efl_Ui_List_View_Seg_Array *pd = calloc(1, sizeof(Efl_Ui_List_View_Seg_Array));
+   pd->step_size = size;
+
+   return pd;
+}
+
+void
+efl_ui_list_view_seg_array_free(Efl_Ui_List_View_Seg_Array *pd)
+{
+   if (pd->root)
+     eina_rbtree_delete(EINA_RBTREE_GET(pd->root), EINA_RBTREE_FREE_CB(_free_node), NULL);
+
+   pd->root = NULL;
+   free(pd);
+}
+
+void
+efl_ui_list_view_seg_array_flush(Efl_Ui_List_View_Seg_Array *pd)
+{
+   if (pd->root)
+     eina_rbtree_delete(EINA_RBTREE_GET(pd->root), EINA_RBTREE_FREE_CB(_free_node), NULL);
+
+   pd->root = NULL;
+   pd->node_count = 0;
+   pd->count = 0;
+}
+
+int
+efl_ui_list_view_seg_array_count(Efl_Ui_List_View_Seg_Array* pd)
+{
+   return pd->count;
+}
+
+void
+efl_ui_list_view_seg_array_insert(Efl_Ui_List_View_Seg_Array* pd, int index, Efl_Model* model)
+{
+  Efl_Ui_List_View_Seg_Array_Node* node, *next;
+  Efl_Ui_List_View_Layout_Item* item;
+
+  item = _create_item_partial(model);
+
+  node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(pd->root),
+                                          &index, sizeof(index), &_insert_lookup_cb, NULL);
+  if(node)
+    {
+      next = (void*)EINA_RBTREE_GET(node)->son[EINA_RBTREE_LEFT];
+      if(next && next->first <= index)
+        _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, next);
+      else
+        _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, node);
+    }
+  else
+    _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, NULL);
+}
+
+void
+efl_ui_list_view_seg_array_insert_value(Efl_Ui_List_View_Seg_Array *pd, int first, Eina_Value v)
+{
+   Efl_Model *children;
+   unsigned int i, len;
+
+   if (eina_value_type_get(&v) == EINA_VALUE_TYPE_OBJECT)
+     {
+        children = eina_value_object_get(&v);
+        _efl_ui_list_view_seg_array_insert_object(pd, first, children);
+     }
+   else if (eina_value_type_get(&v) == EINA_VALUE_TYPE_ARRAY)
+     {
+        EINA_VALUE_ARRAY_FOREACH(&v, len, i, children)
+          {
+             unsigned int idx = first + i;
+
+             _efl_ui_list_view_seg_array_insert_object(pd, idx, children);
+          }
+     }
+   else
+     {
+        printf("Unknow type !\n");
+     }
+}
+
+
+Efl_Ui_List_View_Layout_Item*
+efl_ui_list_view_seg_array_remove(Efl_Ui_List_View_Seg_Array *pd, int index)
+{
+   Efl_Ui_List_View_Seg_Array_Node *node;
+   Efl_Ui_List_View_Layout_Item *item, *rt;
+   Eina_Iterator* iterator;
+   int offset;
+
+   node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(pd->root),
+                                        &index, sizeof(index), &_insert_lookup_cb, NULL);
+   if (!node) return NULL;
+
+   offset = index - node->first;
+   if (offset >= node->length) return NULL;
+
+   rt = node->pointers[offset];
+   pd->count--;
+   node->length--;
+
+   while (offset < node->length)
+     {
+       node->pointers[offset] = node->pointers[offset+1];
+       item = node->pointers[offset];
+       --item->index_offset;
+       ++offset;
+     }
+
+   node = (void*)EINA_RBTREE_GET(node)->son[EINA_RBTREE_LEFT];
+   iterator = eina_rbtree_iterator_infix((void*)node);
+   while(eina_iterator_next(iterator, (void**)&node))
+     node->first--;
+
+   return rt;
+}
+
+Eina_Accessor*
+efl_ui_list_view_seg_array_accessor_get(Efl_Ui_List_View_Seg_Array* pd)
+{
+   Efl_Ui_List_View_Segarray_Eina_Accessor* acc = calloc(1, sizeof(Efl_Ui_List_View_Segarray_Eina_Accessor));
+   _efl_ui_list_view_seg_array_accessor_setup(acc, pd);
+   return &acc->vtable;
+}
+
+Eina_Accessor*
+efl_ui_list_view_seg_array_node_accessor_get(Efl_Ui_List_View_Seg_Array* pd)
 {
    Efl_Ui_List_View_Segarray_Node_Accessor* acc = calloc(1, sizeof(Efl_Ui_List_View_Segarray_Node_Accessor));
    _efl_ui_list_view_seg_array_node_accessor_setup(acc, pd);
    return &acc->vtable;
 }
 
-int efl_ui_list_view_item_index_get(Efl_Ui_List_View_Layout_Item* item)
+int
+efl_ui_list_view_item_index_get(Efl_Ui_List_View_Layout_Item* item)
 {
   Efl_Ui_List_View_Seg_Array_Node* node = item->tree_node;
   return item->index_offset + node->first;
 }
-
-#include "efl_ui_list_view_seg_array.eo.c"
diff --git a/src/lib/elementary/efl_ui_list_view_seg_array.eo b/src/lib/elementary/efl_ui_list_view_seg_array.eo
deleted file mode 100644 (file)
index 228b417..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-import efl_ui_list_view_types;
-
-class Efl.Ui.List_View_Seg_Array extends Efl.Object
-{
-   methods {
-      @property accessor {
-         get {
-            [[ Get a Seg_Array List items accessor ]]
-         }
-         values {
-             acc: accessor<ptr(Efl.Ui.List_View_Layout_Item)>;
-         }
-      }
-      @property node_accessor {
-         get {
-            [[ Get a Seg_Array node accessor ]]
-         }
-         values {
-             acc: accessor<ptr(Efl.Ui.List_View_Seg_Array_Node)>;
-         }
-      }
-      insert_value {
-         [[ Insert a accessor in segarray tree ]]
-          params {
-              @in first: int;
-              @in v: any_value;
-          }
-      }
-      count {
-         [[ Get the number of items in Seg_Array tree ]]
-         return: int;
-      }
-      setup {
-         [[ Configure a step of Seg_Array tree, this is the max node size ]]
-          params {
-              @in initial_step_size: int;
-          }
-      }
-      flush {
-         [[ flush the Seg_Array tree ]]
-      }
-      insert {
-         [[ Insert a new model in Seg_Array tree at index position ]]
-          params {
-              @in index: int;
-              @in model: Efl.Model;
-          }
-      }
-      remove {
-         [[ Remove the item at index position in Seg_Array tree ]]
-          params {
-              @in index: int;
-          }
-          return: ptr(Efl.Ui.List_View_Layout_Item) @owned;
-      }
-   }
-   implements {
-      Efl.Object.constructor;
-      Efl.Object.destructor;
-   }
-}
index 485398d..adbfc28 100644 (file)
@@ -14,13 +14,29 @@ typedef struct _Efl_Ui_List_View_SegArray_Node
    Efl_Ui_List_View_Layout_Item* pointers[0];
 } Efl_Ui_List_View_Seg_Array_Node;
 
-typedef struct _Efl_Ui_List_View_Seg_Array_Data
+typedef struct _Efl_Ui_List_View_Seg_Array
 {
    Efl_Ui_List_View_Seg_Array_Node *root;
 
    int step_size;
    int node_count;
    int count;
-} Efl_Ui_List_View_Seg_Array_Data;
+} Efl_Ui_List_View_Seg_Array;
+
+
+Efl_Ui_List_View_Seg_Array * efl_ui_list_view_seg_array_setup(int size);
+void efl_ui_list_view_seg_array_free(Efl_Ui_List_View_Seg_Array *seg_array);
+void efl_ui_list_view_seg_array_flush(Efl_Ui_List_View_Seg_Array *seg_array);
+int efl_ui_list_view_seg_array_count(Efl_Ui_List_View_Seg_Array* seg_array);
+int efl_ui_list_view_item_index_get(Efl_Ui_List_View_Layout_Item* item);
+
+
+void efl_ui_list_view_seg_array_insert(Efl_Ui_List_View_Seg_Array* seg_array, int index, Efl_Model* model);
+void efl_ui_list_view_seg_array_insert_value(Efl_Ui_List_View_Seg_Array *seg_array, int first, Eina_Value value);
+Efl_Ui_List_View_Layout_Item* efl_ui_list_view_seg_array_remove(Efl_Ui_List_View_Seg_Array *seg_array, int index);
+
+Eina_Accessor* efl_ui_list_view_seg_array_accessor_get(Efl_Ui_List_View_Seg_Array* seg_array);
+Eina_Accessor* efl_ui_list_view_seg_array_node_accessor_get(Efl_Ui_List_View_Seg_Array* seg_array);
+
 
 #endif
index 96237b4..73d2e1d 100644 (file)
@@ -8,5 +8,3 @@ struct @free(free) Efl.Ui.List_View_Layout_Item {
    size: Eina.Size2D;
    pos: Eina.Position2D;
 }
-
-struct @extern Efl.Ui.List_View_Seg_Array_Node; [[ ]]
index a61716a..05e7e0f 100644 (file)
@@ -105,7 +105,6 @@ pub_legacy_eo_files = [
   'elm_table.eo',
   'elm_thumb.eo',
   'efl_ui_textpath_legacy.eo',
-  'efl_ui_list_view_precise_layouter.eo'
 ]
 
 pub_eo_file_target = []
@@ -208,8 +207,6 @@ pub_eo_files = [
   'efl_ui_list_view.eo',
   'efl_ui_list_view_model.eo',
   'efl_ui_list_view_pan.eo',
-  'efl_ui_list_view_seg_array.eo',
-  'efl_ui_list_view_relayout.eo',
   'efl_ui_item.eo',
   'efl_ui_list_item.eo',
   'efl_ui_list_default_item_part_icon.eo',
@@ -340,6 +337,8 @@ priv_eo_files = [
   'efl_ui_model_state.eo',
   'efl_ui_selection_manager.eo',
   'efl_datetime_manager.eo',
+  'efl_ui_list_view_precise_layouter.eo',
+  'efl_ui_list_view_relayout.eo',
 ]
 
 priv_eo_file_target = []