diff options
author | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2019-08-18 18:27:37 +0200 |
---|---|---|
committer | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2019-08-20 10:09:57 +0200 |
commit | 013ab4d528480682e9d709da77af433a5e3a4e61 (patch) | |
tree | 97d8441ebcacdecc4f150d3c8fb2a0e5664d60bb | |
parent | 272d8f50673c69dcc508c666e95a5b4afc70d37e (diff) | |
download | efl-devs/bu5hm4n/arm-test.tar.gz |
efl_ui_position_manager_common: generalize codedevs/bu5hm4n/arm-test
move the same code to a common header file.
Differential Revision: https://phab.enlightenment.org/D9630
-rw-r--r-- | src/lib/elementary/efl_ui_position_manager_common.h | 21 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_position_manager_grid.c | 17 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_position_manager_list.c | 24 |
3 files changed, 23 insertions, 39 deletions
diff --git a/src/lib/elementary/efl_ui_position_manager_common.h b/src/lib/elementary/efl_ui_position_manager_common.h index e74e6d48f2..0c6a847bae 100644 --- a/src/lib/elementary/efl_ui_position_manager_common.h +++ b/src/lib/elementary/efl_ui_position_manager_common.h @@ -11,6 +11,10 @@ typedef struct { Eina_Free_Cb free_cb; } Api_Callback; +typedef struct { + unsigned int start_id, end_id; +} Vis_Segment; + static inline int _fill_buffer(Api_Callback *cb , int start_id, int len, int *group_id, void *data) { @@ -57,3 +61,20 @@ vis_change_segment(Api_Callback *cb, int a, int b, Eina_Bool flag) } } #endif + +static inline void +vis_segment_swap(Api_Callback *cb, Vis_Segment new, Vis_Segment old) +{ + if (new.end_id <= old.start_id || new.start_id >= old.end_id) + { + //it is important to first make the segment visible here, and then hide the rest + //otherwise we get a state where item_container has 0 subchildren, which triggers a lot of focus logic. + vis_change_segment(cb, new.start_id, new.end_id, EINA_TRUE); + vis_change_segment(cb, old.start_id, old.end_id, EINA_FALSE); + } + else + { + vis_change_segment(cb, old.start_id, new.start_id, (old.start_id > new.start_id)); + vis_change_segment(cb, old.end_id, new.end_id, (old.end_id < new.end_id)); + } +} diff --git a/src/lib/elementary/efl_ui_position_manager_grid.c b/src/lib/elementary/efl_ui_position_manager_grid.c index db84dd7fe2..3968884442 100644 --- a/src/lib/elementary/efl_ui_position_manager_grid.c +++ b/src/lib/elementary/efl_ui_position_manager_grid.c @@ -13,10 +13,6 @@ Efl_Ui_Position_Manager_Grid_Data *pd = efl_data_scope_get(obj, MY_CLASS); typedef struct { - unsigned int start_id, end_id; -} Vis_Segment; - -typedef struct { Api_Callback min_size, object; unsigned int size; unsigned int groups; @@ -460,18 +456,7 @@ _reposition_content(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_Grid_Data *pd) //to performance optimize the whole widget, we are setting the objects that are outside the viewport to visibility false //The code below ensures that things outside the viewport are always hidden, and things inside the viewport are visible - if (cur.end_id < pd->prev_run.start_id || cur.start_id > pd->prev_run.end_id) - { - //it is important to first make the segment visible here, and then hide the rest - //otherwise we get a state where item_container has 0 subchildren, which triggers a lot of focus logic. - vis_change_segment(&pd->object, cur.start_id, cur.end_id, EINA_TRUE); - vis_change_segment(&pd->object, pd->prev_run.start_id, pd->prev_run.end_id, EINA_FALSE); - } - else - { - vis_change_segment(&pd->object, pd->prev_run.start_id, cur.start_id, (pd->prev_run.start_id > cur.start_id)); - vis_change_segment(&pd->object, pd->prev_run.end_id, cur.end_id, (pd->prev_run.end_id < cur.end_id)); - } + vis_segment_swap(&pd->object, cur, pd->prev_run); ctx.new = cur; ctx.consumed_space = consumed_space; diff --git a/src/lib/elementary/efl_ui_position_manager_list.c b/src/lib/elementary/efl_ui_position_manager_list.c index a3bd452522..3200caad8b 100644 --- a/src/lib/elementary/efl_ui_position_manager_list.c +++ b/src/lib/elementary/efl_ui_position_manager_list.c @@ -13,11 +13,6 @@ #define MY_DATA_GET(obj, pd) \ Efl_Ui_Position_Manager_List_Data *pd = efl_data_scope_get(obj, MY_CLASS); - -typedef struct { - unsigned int start_id, end_id; -} Vis_Segment; - typedef struct { Api_Callback min_size, object; unsigned int size; @@ -169,23 +164,6 @@ err: } static inline void -_visual_segment_swap(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_List_Data *pd, Vis_Segment new, Vis_Segment old) -{ - if (new.end_id <= old.start_id || new.start_id >= old.end_id) - { - //it is important to first make the segment visible here, and then hide the rest - //otherwise we get a state where item_container has 0 subchildren, which triggers a lot of focus logic. - vis_change_segment(&pd->object, new.start_id, new.end_id, EINA_TRUE); - vis_change_segment(&pd->object, old.start_id, old.end_id, EINA_FALSE); - } - else - { - vis_change_segment(&pd->object, old.start_id, new.start_id, (old.start_id > new.start_id)); - vis_change_segment(&pd->object, old.end_id, new.end_id, (old.end_id < new.end_id)); - } -} - -static inline void _position_items(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_List_Data *pd, Vis_Segment new, int relevant_space_size) { int group_id = -1; @@ -327,7 +305,7 @@ position_content(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_List_Data *pd) cur = _search_visual_segment(obj, pd, relevant_space_size, relevant_viewport); //to performance optimize the whole widget, we are setting the objects that are outside the viewport to visibility false //The code below ensures that things outside the viewport are always hidden, and things inside the viewport are visible - _visual_segment_swap(obj, pd, cur, pd->prev_run); + vis_segment_swap(&pd->object, cur, pd->prev_run); _position_items(obj, pd, cur, relevant_space_size); |