summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaeun Choi <jaeun12.choi@samsung.com>2018-04-22 18:32:25 +0900
committerJaeun Choi <jaeun12.choi@samsung.com>2018-04-23 16:28:41 +0900
commit7a123b0da5d5ec2582b1602f94d6d38eb523e1f8 (patch)
tree0a0a388ab16f4001f50bf139a34e9bd9e11fb27a
parent8fddd8ec7fd031bf311ea3a920c55f97f9c4dc45 (diff)
downloadefl-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.c22
-rw-r--r--src/lib/elementary/efl_page_transition_scroll.c125
-rw-r--r--src/lib/elementary/efl_ui_pager.c43
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;