From 36eff7ed82a6d5dc1944dc6b03278c5bb9a7796d Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Tue, 3 Sep 2019 10:52:04 +0200 Subject: [PATCH] efl_ui_grid_position_manager: recalculate max min size correctly we are walking all the items anyways, so we can recalc the minsize here anyways. Additionally, this pm was never tested with code that just passes a set of items at data-access init time, without calling item_added for each item. (Which is perfectly fine). With this commit this is now perfectly possible, Reviewed-by: Mike Blumenkrantz Differential Revision: https://phab.enlightenment.org/D9826 --- .../elementary/efl_ui_position_manager_grid.c | 33 +++++++++++++++---- .../efl_ui_position_manager_grid.eo | 1 + 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/lib/elementary/efl_ui_position_manager_grid.c b/src/lib/elementary/efl_ui_position_manager_grid.c index cc628b6bec..92d495efc4 100644 --- a/src/lib/elementary/efl_ui_position_manager_grid.c +++ b/src/lib/elementary/efl_ui_position_manager_grid.c @@ -38,6 +38,13 @@ typedef struct { int items; } Group_Cache_Line; +static inline void +_update_min_size(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_Grid_Data *pd, int added_index EINA_UNUSED, Eina_Size2D min_size) +{ + pd->max_min_size.w = MAX(pd->max_min_size.w, min_size.w); + pd->max_min_size.h = MAX(pd->max_min_size.h, min_size.h); +} + static void _group_cache_require(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_Grid_Data *pd) { @@ -50,6 +57,8 @@ _group_cache_require(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_Grid_Data *pd) if (!pd->group_cache_dirty) return; + pd->max_min_size = EINA_SIZE2D(0, 0); + pd->group_cache_dirty = EINA_FALSE; if (pd->group_cache) eina_inarray_free(pd->group_cache); @@ -83,6 +92,7 @@ _group_cache_require(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_Grid_Data *pd) line.group_header_size = EINA_SIZE2D(0, 0); line.items = 0; } + _update_min_size(obj, pd, i, size_buffer[buffer_id].size); } eina_inarray_push(pd->group_cache, &line); } @@ -508,13 +518,6 @@ _flush_abs_size(Eo *obj, Efl_Ui_Position_Manager_Grid_Data *pd) } } -static inline void -_update_min_size(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_Grid_Data *pd, int added_index EINA_UNUSED, Eina_Size2D min_size) -{ - pd->max_min_size.w = MAX(pd->max_min_size.w, min_size.w); - pd->max_min_size.h = MAX(pd->max_min_size.h, min_size.h); -} - static inline void _flush_min_size(Eo *obj, Efl_Ui_Position_Manager_Grid_Data *pd) { @@ -762,6 +765,22 @@ _efl_ui_position_manager_grid_efl_ui_position_manager_data_access_v1_data_access pd->callbacks.size.access = size_access; pd->callbacks.size.free_cb = size_access_free_cb; pd->size = size; + _group_cache_require(obj, pd); + _schedule_recalc_abs_size(obj, pd); + } +EOLIAN static Efl_Object* +_efl_ui_position_manager_grid_efl_object_finalize(Eo *obj, Efl_Ui_Position_Manager_Grid_Data *pd) +{ + obj = efl_finalize(efl_super(obj, MY_CLASS)); + + pd->group_cache_dirty = EINA_TRUE; + _group_cache_require(obj, pd); + _schedule_recalc_abs_size(obj, pd); + + return obj; +} + + #include "efl_ui_position_manager_grid.eo.c" diff --git a/src/lib/elementary/efl_ui_position_manager_grid.eo b/src/lib/elementary/efl_ui_position_manager_grid.eo index f8f1aa831f..0af0270545 100644 --- a/src/lib/elementary/efl_ui_position_manager_grid.eo +++ b/src/lib/elementary/efl_ui_position_manager_grid.eo @@ -17,5 +17,6 @@ class @beta Efl.Ui.Position_Manager.Grid extends Efl.Object Efl.Ui.Position_Manager.Entity.relative_item; Efl.Ui.Layout_Orientable.orientation {set; get;} Efl.Ui.Position_Manager.Data_Access_V1.data_access {set;} + Efl.Object.finalize; } }