diff options
author | Jaeun Choi <jaeun12.choi@samsung.com> | 2018-04-22 18:32:25 +0900 |
---|---|---|
committer | Jaeun Choi <jaeun12.choi@samsung.com> | 2018-04-23 16:28:41 +0900 |
commit | 7a123b0da5d5ec2582b1602f94d6d38eb523e1f8 (patch) | |
tree | 0a0a388ab16f4001f50bf139a34e9bd9e11fb27a | |
parent | 8fddd8ec7fd031bf311ea3a920c55f97f9c4dc45 (diff) | |
download | efl-7a123b0da5d5ec2582b1602f94d6d38eb523e1f8.tar.gz |
efl_ui_pager: implement the case where NULL is passed as transition_set parameter
-rw-r--r-- | src/lib/elementary/efl_page_transition.c | 22 | ||||
-rw-r--r-- | src/lib/elementary/efl_page_transition_scroll.c | 125 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_pager.c | 43 |
3 files changed, 136 insertions, 54 deletions
diff --git a/src/lib/elementary/efl_page_transition.c b/src/lib/elementary/efl_page_transition.c index ef862a73e0..3ad29c6441 100644 --- a/src/lib/elementary/efl_page_transition.c +++ b/src/lib/elementary/efl_page_transition.c @@ -33,20 +33,26 @@ _efl_page_transition_bind(Eo *obj EINA_UNUSED, Eo *pager, Efl_Canvas_Group *group) { - EFL_UI_PAGER_DATA_GET(pager, ppd); + Eina_Rect group_rect; + + if (pd->pager.obj == pager) return; pd->pager.obj = pager; pd->pager.group = group; - pd->pager.x = ppd->x; - pd->pager.y = ppd->y; - pd->pager.w = ppd->w; - pd->pager.h = ppd->h; + if (pager) + { + group_rect = efl_gfx_geometry_get(group); - pd->page_spec.sz = ppd->page_spec.sz; - pd->page_spec.padding = ppd->page_spec.padding; + pd->pager.x = group_rect.x; + pd->pager.y = group_rect.y; + pd->pager.w = group_rect.w; + pd->pager.h = group_rect.h; - pd->loop = ppd->loop; + pd->page_spec.sz = efl_ui_pager_page_size_get(pager); + pd->page_spec.padding = efl_ui_pager_padding_get(pager); + pd->loop = efl_ui_pager_loop_mode_get(pager); + } } EOLIAN static void diff --git a/src/lib/elementary/efl_page_transition_scroll.c b/src/lib/elementary/efl_page_transition_scroll.c index 9fcdc64532..b797ffa8d2 100644 --- a/src/lib/elementary/efl_page_transition_scroll.c +++ b/src/lib/elementary/efl_page_transition_scroll.c @@ -14,14 +14,30 @@ #define DEBUG 0 +static void +_page_info_deallocate(Efl_Page_Transition_Scroll_Data *pd) +{ + Page_Info *pi; + + EINA_LIST_FREE(pd->page_infos, pi) + { + if (pi->content) + efl_pack_unpack(pi->obj, pi->content); + + efl_del(pi->obj); + free(pi); + } + + pd->head = NULL; + pd->tail = NULL; +} static void _page_info_allocate(Efl_Page_Transition_Scroll_Data *pd, Efl_Page_Transition_Data *spd) { - Eina_List *list; Page_Info *pi, *prev = NULL; - int i, tmp; + int i; for (i = 0; i < pd->page_info_num; i++) { @@ -220,22 +236,46 @@ _efl_page_transition_scroll_efl_page_transition_bind(Eo *obj, { EFL_PAGE_TRANSITION_DATA_GET(obj, spd); + if (spd->pager.obj == pager) return; + + if (spd->pager.obj) + { + efl_event_callback_del(spd->pager.group, EFL_GFX_EVENT_RESIZE, _resize_cb, obj); + efl_event_callback_del(spd->pager.group, EFL_GFX_EVENT_MOVE, _move_cb, obj); + + _page_info_deallocate(pd); + efl_del(pd->foreclip); + efl_del(pd->backclip); + } + efl_page_transition_bind(efl_super(obj, MY_CLASS), pager, group); - efl_event_callback_add(spd->pager.group, EFL_GFX_EVENT_RESIZE, _resize_cb, obj); - efl_event_callback_add(spd->pager.group, EFL_GFX_EVENT_MOVE, _move_cb, obj); + if (spd->pager.obj) + { + int cnt, i; + Eo *item; - pd->foreclip = efl_add(EFL_CANVAS_RECTANGLE_CLASS, - evas_object_evas_get(spd->pager.obj)); - evas_object_static_clip_set(pd->foreclip, EINA_TRUE); + efl_event_callback_add(spd->pager.group, EFL_GFX_EVENT_RESIZE, _resize_cb, obj); + efl_event_callback_add(spd->pager.group, EFL_GFX_EVENT_MOVE, _move_cb, obj); - pd->backclip = efl_add(EFL_CANVAS_RECTANGLE_CLASS, - evas_object_evas_get(spd->pager.obj)); - evas_object_static_clip_set(pd->backclip, EINA_TRUE); - efl_gfx_visible_set(pd->backclip, EINA_FALSE); + pd->foreclip = efl_add(EFL_CANVAS_RECTANGLE_CLASS, + evas_object_evas_get(spd->pager.obj)); + evas_object_static_clip_set(pd->foreclip, EINA_TRUE); - _page_info_allocate(pd, spd); - _content_show(pd, spd); + pd->backclip = efl_add(EFL_CANVAS_RECTANGLE_CLASS, + evas_object_evas_get(spd->pager.obj)); + evas_object_static_clip_set(pd->backclip, EINA_TRUE); + efl_gfx_visible_set(pd->backclip, EINA_FALSE); + + cnt = efl_content_count(spd->pager.obj); + for (i = 0; i < cnt; i++) + { + item = efl_pack_content_get(spd->pager.obj, i); + efl_canvas_object_clip_set(item, pd->backclip); + } + _page_info_allocate(pd, spd); + _page_info_geometry_change(pd, spd); + } } EOLIAN static void @@ -279,6 +319,14 @@ _efl_page_transition_scroll_update(Eo *obj, curr_page = efl_ui_pager_current_page_get(spd->pager.obj); cnt = efl_content_count(spd->pager.obj); +#if DEBUG + EINA_LIST_FOREACH(pd->page_infos, list, pi) + { + ERR("[before: pi %p] id %d vis_page %d visible %d content %d", + pi, pi->id, pi->vis_page, pi->visible, pi->content_num); + } + printf("\n"); +#endif // while pages are scrolled, // 1. the geometry of each page needs to be changed // 2. if a page gets out of the viewport, it needs to be hidden @@ -290,7 +338,6 @@ _efl_page_transition_scroll_update(Eo *obj, else // else if scrolled left, each page takes prev page's position tpi = pi->prev; - EINA_RECTANGLE_SET(&pi->temp, tpi->geometry.x * t + pi->geometry.x * (1 - t), tpi->geometry.y, @@ -319,26 +366,32 @@ _efl_page_transition_scroll_update(Eo *obj, else { tmp_id = (curr_page + pi->pos + cnt) % cnt; - if (pi->content) //FIXME if the content num is the same, do nothing - { - efl_pack_unpack(pi->obj, pi->content); - efl_canvas_object_clip_set(pi->content, pd->backclip); - } - - if ((spd->loop == EFL_UI_PAGER_LOOP_DISABLED) - && ((pi->pos) * (tmp_id - curr_page) < 0)) continue; - - tmp = efl_pack_content_get(spd->pager.obj, tmp_id); - if (tmp) + if (pi->content_num != tmp_id) { - efl_canvas_object_clip_set(pi->obj, pd->foreclip); - - efl_pack(pi->obj, tmp); - efl_canvas_object_clip_set(tmp, pd->foreclip); - - pi->content_num = tmp_id; - pi->content = tmp; - pi->visible = EINA_TRUE; + if (pi->content) //FIXME if the content num is the same, do nothing + { + efl_pack_unpack(pi->obj, pi->content); + efl_canvas_object_clip_set(pi->content, pd->backclip); + + pi->content_num = -1; + pi->content = NULL; + } + + if ((spd->loop == EFL_UI_PAGER_LOOP_DISABLED) + && ((pi->pos) * (tmp_id - curr_page) < 0)) continue; + tmp = efl_pack_content_get(spd->pager.obj, tmp_id); + + if (tmp) + { + efl_canvas_object_clip_set(pi->obj, pd->foreclip); + + efl_pack(pi->obj, tmp); + efl_canvas_object_clip_set(tmp, pd->foreclip); + + pi->content_num = tmp_id; + pi->content = tmp; + pi->visible = EINA_TRUE; + } } } } @@ -346,8 +399,8 @@ _efl_page_transition_scroll_update(Eo *obj, #if DEBUG EINA_LIST_FOREACH(pd->page_infos, list, pi) { - ERR("[id: %d] vis_page %d visible %d content %d", - pi->id, pi->vis_page, pi->visible, pi->content_num); + ERR("[after : pi %p] id %d vis_page %d visible %d content %d", + pi, pi->id, pi->vis_page, pi->visible, pi->content_num); } printf("\n"); #endif @@ -441,7 +494,7 @@ _efl_page_transition_scroll_pack_end(Eo *obj EINA_UNUSED, } EOLIAN static int -_efl_page_transition_scroll_side_page_num_get(Eo *obj EINA_UNUSED, +_efl_page_transition_scroll_side_page_num_get(const Eo *obj EINA_UNUSED, Efl_Page_Transition_Scroll_Data *pd) { return pd->side_page_num; diff --git a/src/lib/elementary/efl_ui_pager.c b/src/lib/elementary/efl_ui_pager.c index d950a69f4e..6677d63051 100644 --- a/src/lib/elementary/efl_ui_pager.c +++ b/src/lib/elementary/efl_ui_pager.c @@ -278,6 +278,7 @@ _event_handler_del(Eo *obj, Efl_Ui_Pager_Data *pd) { efl_content_unset(efl_part(obj, "event")); efl_del(pd->event); + pd->event = NULL; } EOLIAN static Eo * @@ -322,6 +323,7 @@ _resize_cb(void *data, const Efl_Event *ev) efl_page_transition_page_size_set(pd->transition, pd->page_spec.sz); else { + efl_gfx_size_set(pd->foreclip, sz); efl_gfx_size_set(pd->page_box, pd->page_spec.sz); efl_gfx_position_set(pd->page_box, EINA_POSITION2D(pd->x + (pd->w / 2) - (pd->page_spec.sz.w / 2), @@ -342,6 +344,7 @@ _move_cb(void *data, const Efl_Event *ev) if (!pd->transition) { + efl_gfx_position_set(pd->foreclip, pos); efl_gfx_position_set(pd->page_box, EINA_POSITION2D(pd->x + (pd->w / 2) - (pd->page_spec.sz.w / 2), pd->y + (pd->h / 2) - (pd->page_spec.sz.h / 2))); @@ -371,12 +374,16 @@ _efl_ui_pager_efl_object_finalize(Eo *obj, /* default setting (no transition) */ pd->page_box = efl_add(EFL_UI_BOX_CLASS, obj); efl_canvas_group_member_add(pd->page_root, pd->page_box); + pd->foreclip = efl_add(EFL_CANVAS_RECTANGLE_CLASS, evas_object_evas_get(obj)); + efl_canvas_group_member_add(pd->page_root, pd->foreclip); evas_object_static_clip_set(pd->foreclip, EINA_TRUE); + efl_canvas_object_clip_set(pd->page_box, pd->foreclip); pd->backclip = efl_add(EFL_CANVAS_RECTANGLE_CLASS, evas_object_evas_get(obj)); + efl_canvas_group_member_add(pd->page_root, pd->backclip); evas_object_static_clip_set(pd->backclip, EINA_TRUE); efl_gfx_visible_set(pd->backclip, EINA_FALSE); /* default setting end */ @@ -579,7 +586,7 @@ _efl_ui_pager_current_page_set(Eo *obj, Eo *curr; curr = eina_list_nth(pd->content_list, pd->curr.page); - efl_pack_unpack_all(pd->page_box); + efl_pack_unpack(pd->page_box, curr); efl_canvas_object_clip_set(curr, pd->backclip); pd->curr.page = index; @@ -613,23 +620,36 @@ _efl_ui_pager_current_page_set(Eo *obj, } EOLIAN static int -_efl_ui_pager_current_page_get(Eo *obj EINA_UNUSED, +_efl_ui_pager_current_page_get(const Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd) { return pd->curr.page; } EOLIAN static void -_efl_ui_pager_transition_set(Eo *obj EINA_UNUSED, +_efl_ui_pager_transition_set(Eo *obj, Efl_Ui_Pager_Data *pd, Efl_Page_Transition *transition) { + if (pd->transition == transition) return; + + if (pd->transition) + efl_page_transition_bind(pd->transition, NULL, NULL); + else + { + Eo *curr; + + curr = eina_list_nth(pd->content_list, pd->curr.page); + efl_pack_unpack(pd->page_box, curr); + efl_canvas_object_clip_set(pd->page_box, pd->backclip); + } + pd->transition = transition; - if (transition) + if (pd->transition) { - _event_handler_create(obj, pd); - efl_page_transition_bind(transition, obj, pd->page_root); + if (!pd->event) _event_handler_create(obj, pd); + efl_page_transition_bind(pd->transition, obj, pd->page_root); } else { @@ -637,6 +657,9 @@ _efl_ui_pager_transition_set(Eo *obj EINA_UNUSED, Eo *curr; _event_handler_del(obj, pd); + + efl_canvas_object_clip_set(pd->page_box, pd->foreclip); + EINA_LIST_FOREACH(pd->content_list, list, curr) { efl_canvas_object_clip_set(curr, pd->backclip); @@ -675,7 +698,7 @@ _efl_ui_pager_indicator_set(Eo *obj EINA_UNUSED, } EOLIAN Eina_Size2D -_efl_ui_pager_page_size_get(Eo *obj EINA_UNUSED, +_efl_ui_pager_page_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd) { return pd->page_spec.sz; @@ -716,7 +739,7 @@ _efl_ui_pager_page_size_set(Eo *obj EINA_UNUSED, } EOLIAN static int -_efl_ui_pager_padding_get(Eo *obj EINA_UNUSED, +_efl_ui_pager_padding_get(const Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd) { return pd->page_spec.padding; @@ -733,7 +756,7 @@ _efl_ui_pager_padding_set(Eo *obj EINA_UNUSED, } EOLIAN static void -_efl_ui_pager_scroll_block_get(Eo *obj EINA_UNUSED, +_efl_ui_pager_scroll_block_get(const Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd, Eina_Bool *prev, Eina_Bool *next) @@ -763,7 +786,7 @@ _efl_ui_pager_loop_mode_set(Eo *obj EINA_UNUSED, } EOLIAN static Efl_Ui_Pager_Loop -_efl_ui_pager_loop_mode_get(Eo *obj EINA_UNUSED, +_efl_ui_pager_loop_mode_get(const Eo *obj EINA_UNUSED, Efl_Ui_Pager_Data *pd) { return pd->loop; |