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 --