cedric pushed a commit to branch master.

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

commit 4f45749b14abeae6c0338f07b42970e814f85b8e
Author: Marcel Hollerbach <m...@marcel-hollerbach.de>
Date:   Wed Jul 31 19:52:08 2019 +0200

    efl_ui_position_manager: add event for updating the range
    
    the new event can be used to message back the currently visible range
    from the position to the collection / collection_view.
    
    Reviewed-by: Mike Blumenkrantz <michael.blumenkra...@gmail.com>
    Reviewed-by: Cedric BAIL <cedric.b...@free.fr>
    Differential Revision: https://phab.enlightenment.org/D9462
---
 src/lib/elementary/efl_ui_position_manager_entity.eo |  7 +++++++
 src/lib/elementary/efl_ui_position_manager_grid.c    |  9 +++++++--
 src/lib/elementary/efl_ui_position_manager_list.c    | 10 ++++++++--
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/lib/elementary/efl_ui_position_manager_entity.eo 
b/src/lib/elementary/efl_ui_position_manager_entity.eo
index 4a65572181..64c68344d8 100644
--- a/src/lib/elementary/efl_ui_position_manager_entity.eo
+++ b/src/lib/elementary/efl_ui_position_manager_entity.eo
@@ -17,6 +17,12 @@ function Efl.Ui.Position_Manager.Batch_Access_Size {
    return: int; [[The number of filled elements in the slice]]
 };
 
+struct Efl.Ui.Position_Manager.Range_Update {
+   [[A struct containing the the updated range of visible items in this 
position manger]]
+   start_id : uint; [[The first item that is visible]]
+   end_id : uint; [[The last item that is visible]]
+}
+
 interface @beta Efl.Ui.Position_Manager.Entity extends Efl.Ui.Layout_Orientable
 {
    [[
@@ -112,5 +118,6 @@ interface @beta Efl.Ui.Position_Manager.Entity extends 
Efl.Ui.Layout_Orientable
    events {
      content_size,changed : Eina.Size2D; [[Emitted when the aggregate size of 
all items has changed. This can be used to resize an enclosing Pan object.]]
      content_min_size,changed : Eina.Size2D; [[Emitted when the minimum size 
of all items has changed. The minimum size is the size, that this 
position_manager needs at *least* to display a single item.]]
+     visible_range,changed : Efl.Ui.Position_Manager.Range_Update;
    }
 }
diff --git a/src/lib/elementary/efl_ui_position_manager_grid.c 
b/src/lib/elementary/efl_ui_position_manager_grid.c
index 2de7ddf896..bf8f793d12 100644
--- a/src/lib/elementary/efl_ui_position_manager_grid.c
+++ b/src/lib/elementary/efl_ui_position_manager_grid.c
@@ -38,6 +38,7 @@ _reposition_content(Eo *obj EINA_UNUSED, 
Efl_Ui_Position_Manager_Grid_Data *pd)
    unsigned int start_id, end_id, step;
    const int len = 100;
    Efl_Gfx_Entity *obj_buffer[len];
+   Efl_Ui_Position_Manager_Range_Update ev;
 
    if (!pd->size) return;
    if (pd->max_min_size.w <= 0 || pd->max_min_size.h <= 0) return;
@@ -111,8 +112,12 @@ _reposition_content(Eo *obj EINA_UNUSED, 
Efl_Ui_Position_Manager_Grid_Data *pd)
         //printf(">%d (%d, %d, %d, %d) %p\n", i, geom.x, geom.y, geom.w, 
geom.h, ent);
         efl_gfx_entity_geometry_set(ent, geom);
      }
-   pd->prev_run.start_id = start_id;
-   pd->prev_run.end_id = end_id;
+   if (pd->prev_run.start_id != start_id || pd->prev_run.end_id != end_id)
+     {
+        ev.start_id = pd->prev_run.start_id = start_id;
+        ev.end_id = pd->prev_run.end_id = end_id;
+        efl_event_callback_call(obj, 
EFL_UI_POSITION_MANAGER_ENTITY_EVENT_VISIBLE_RANGE_CHANGED, &ev);
+     }
 }
 
 static inline void
diff --git a/src/lib/elementary/efl_ui_position_manager_list.c 
b/src/lib/elementary/efl_ui_position_manager_list.c
index 4a8497b4bd..e644a77736 100644
--- a/src/lib/elementary/efl_ui_position_manager_list.c
+++ b/src/lib/elementary/efl_ui_position_manager_list.c
@@ -142,6 +142,7 @@ position_content(Eo *obj EINA_UNUSED, 
Efl_Ui_Position_Manager_List_Data *pd)
    const int len = 100;
    Eina_Size2D size_buffer[len];
    Efl_Gfx_Entity *obj_buffer[len];
+   Efl_Ui_Position_Manager_Range_Update ev;
 
    if (!pd->size) return;
    if (pd->average_item_size <= 0) return;
@@ -233,8 +234,13 @@ position_content(Eo *obj EINA_UNUSED, 
Efl_Ui_Position_Manager_List_Data *pd)
         else
           geom.x += size.w;
      }
-   pd->prev_run.start_id = start_id;
-   pd->prev_run.end_id = end_id;
+   if (pd->prev_run.start_id != start_id || pd->prev_run.end_id != end_id)
+     {
+        ev.start_id = pd->prev_run.start_id = start_id;
+        ev.end_id = pd->prev_run.end_id = end_id;
+        efl_event_callback_call(obj, 
EFL_UI_POSITION_MANAGER_ENTITY_EVENT_VISIBLE_RANGE_CHANGED, &ev);
+     }
+
 }
 
 static Eina_Value

-- 


Reply via email to