bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=36eff7ed82a6d5dc1944dc6b03278c5bb9a7796d

commit 36eff7ed82a6d5dc1944dc6b03278c5bb9a7796d
Author: Marcel Hollerbach <m...@marcel-hollerbach.de>
Date:   Tue Sep 3 10:52:04 2019 +0200

    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 <michael.blumenkra...@gmail.com>
    Differential Revision: https://phab.enlightenment.org/D9826
---
 src/lib/elementary/efl_ui_position_manager_grid.c  | 33 +++++++++++++++++-----
 src/lib/elementary/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;
    }
 }

-- 


Reply via email to