elementary: reduce events triggered by Efl.Ui.PositionManager.

Reviewed-by: SangHyeon Jade Lee <sh10233.lee@samsung.com>
Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de>
Differential Revision: https://phab.enlightenment.org/D10687
This commit is contained in:
Cedric BAIL 2019-11-15 11:05:36 -08:00 committed by Marcel Hollerbach
parent d62e2585bb
commit 2b324779c9
6 changed files with 24 additions and 4 deletions

View File

@ -961,6 +961,7 @@ _efl_ui_collection_position_manager_set(Eo *obj, Efl_Ui_Collection_Data *pd, Efl
{
case 1:
efl_ui_position_manager_data_access_v1_data_access_set(pd->pos_man,
efl_provider_find(obj, EFL_UI_WIN_CLASS),
&pd->obj_accessor, _obj_accessor_get_at, NULL,
&pd->size_accessor, _size_accessor_get_at, NULL,
eina_list_count(pd->items));

View File

@ -1648,6 +1648,7 @@ _efl_ui_collection_view_position_manager_set(Eo *obj, Efl_Ui_Collection_View_Dat
{
case 1:
efl_ui_position_manager_data_access_v1_data_access_set(pd->manager,
efl_provider_find(obj, EFL_UI_WIN_CLASS),
efl_ref(obj), _batch_entity_cb, _unref_cb,
efl_ref(obj), _batch_size_cb, _unref_cb,
count);
@ -1992,6 +1993,7 @@ _efl_ui_collection_view_model_changed(void *data, const Efl_Event *event)
{
case 1:
efl_ui_position_manager_data_access_v1_data_access_set(pd->manager,
efl_provider_find(data, EFL_UI_WIN_CLASS),
efl_ref(data), _batch_entity_cb, _unref_cb,
efl_ref(data), _batch_size_cb, _unref_cb,
count);

View File

@ -116,6 +116,7 @@ interface @beta Efl.Ui.Position_Manager.Data_Access_V1 {
set {
}
values {
canvas: Efl.Ui.Win; [[Will use this object to freeze/thaw canvas events.]]
obj_access : Efl.Ui.Position_Manager.Object_Batch_Callback; [[Function callback for canvas objects, even if
the start_id is valid, the returned objects
may be $NULL.]]

View File

@ -30,6 +30,8 @@ typedef struct {
Eina_Bool size_cache_dirty;
Eo *last_group;
Eina_Future *rebuild_absolut_size;
Efl_Ui_Win *window;
Evas *canvas;
Api_Callbacks callbacks;
} Efl_Ui_Position_Manager_Grid_Data;
@ -769,7 +771,7 @@ _efl_ui_position_manager_grid_efl_ui_position_manager_entity_version(Eo *obj EIN
}
EOLIAN static void
_efl_ui_position_manager_grid_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Ui_Position_Manager_Grid_Data *pd, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
_efl_ui_position_manager_grid_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Ui_Position_Manager_Grid_Data *pd, Efl_Ui_Win *canvas, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
{
// Cleanup cache first
_group_cache_invalidate(obj, pd);
@ -781,6 +783,9 @@ _efl_ui_position_manager_grid_efl_ui_position_manager_data_access_v1_data_access
pd->callbacks.size.free_cb(pd->callbacks.size.data);
// Set them
efl_replace(&pd->window, canvas);
efl_replace(&pd->canvas, canvas ? evas_object_evas_get(canvas) : NULL);
pd->callbacks.object.data = obj_access_data;
pd->callbacks.object.access = obj_access;
pd->callbacks.object.free_cb = obj_access_free_cb;
@ -797,7 +802,7 @@ EOLIAN static void
_efl_ui_position_manager_grid_efl_object_invalidate(Eo *obj,
Efl_Ui_Position_Manager_Grid_Data *pd EINA_UNUSED)
{
efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, 0);
efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
efl_invalidate(efl_super(obj, EFL_UI_POSITION_MANAGER_GRID_CLASS));
}

View File

@ -25,6 +25,8 @@ typedef struct {
int maximum_min_size;
Vis_Segment prev_run;
Efl_Gfx_Entity *last_group;
Efl_Ui_Win *window;
Evas *canvas;
Api_Callbacks callbacks;
} Efl_Ui_Position_Manager_List_Data;
@ -193,6 +195,8 @@ _position_items(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_List_Data *pd, Vis_
else
geom.x -= (relevant_space_size - cache_access(obj, pd, new.start_id));
evas_event_freeze(pd->canvas);
for (i = new.start_id; i < new.end_id; ++i)
{
Eina_Size2D size;
@ -291,6 +295,9 @@ _position_items(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_List_Data *pd, Vis_
efl_gfx_entity_position_set(first_group, first_group_pos);
efl_gfx_entity_size_set(first_group, first_group_size);
evas_event_thaw(pd->canvas);
evas_event_thaw_eval(pd->canvas);
}
@ -503,7 +510,7 @@ _efl_ui_position_manager_list_efl_object_invalidate(Eo *obj, Efl_Ui_Position_Man
if (pd->rebuild_absolut_size)
eina_future_cancel(pd->rebuild_absolut_size);
efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, 0);
efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
efl_invalidate(efl_super(obj, MY_CLASS));
}
@ -542,7 +549,7 @@ _efl_ui_position_manager_list_efl_ui_position_manager_entity_version(Eo *obj EIN
}
EOLIAN static void
_efl_ui_position_manager_list_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Ui_Position_Manager_List_Data *pd, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
_efl_ui_position_manager_list_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Ui_Position_Manager_List_Data *pd, Efl_Ui_Win *canvas, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
{
// Cleanup cache first
cache_invalidate(obj, pd);
@ -554,6 +561,9 @@ _efl_ui_position_manager_list_efl_ui_position_manager_data_access_v1_data_access
pd->callbacks.size.free_cb(pd->callbacks.size.data);
// Set them
efl_replace(&pd->window, canvas);
efl_replace(&pd->canvas, canvas ? evas_object_evas_get(canvas) : NULL);
pd->callbacks.object.data = obj_access_data;
pd->callbacks.object.access = obj_access;
pd->callbacks.object.free_cb = obj_access_free_cb;

View File

@ -71,6 +71,7 @@ _initial_setup(void)
arr_size = eina_inarray_new(sizeof(Eina_Size2D), 10);
efl_ui_position_manager_data_access_v1_data_access_set(position_manager,
win,
NULL, _obj_accessor_get_at, NULL,
NULL, _size_accessor_get_at, NULL,
0);