forked from enlightenment/efl
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.blumenkrantz@gmail.com> Differential Revision: https://phab.enlightenment.org/D9826
This commit is contained in:
parent
d73190a0bf
commit
36eff7ed82
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue