diff --git a/src/lib/elementary/efl_ui_spotlight_manager_plain.c b/src/lib/elementary/efl_ui_spotlight_manager_plain.c index d9c52ab3db..81c954e62f 100644 --- a/src/lib/elementary/efl_ui_spotlight_manager_plain.c +++ b/src/lib/elementary/efl_ui_spotlight_manager_plain.c @@ -10,6 +10,7 @@ typedef struct { Efl_Ui_Spotlight_Container * container; Eina_Size2D page_size; Efl_Ui_Widget *current_content; + Efl_Gfx_Entity *clipper; Eina_Bool animation; double last_pos; } Efl_Ui_Spotlight_Manager_Plain_Data; @@ -36,6 +37,7 @@ _geom_sync(Eo *obj EINA_UNUSED, Efl_Ui_Spotlight_Manager_Plain_Data *pd) goal.size = pd->page_size; goal.y = (group_pos.y + group_pos.h/2)-pd->page_size.h/2; goal.x = (group_pos.x + group_pos.w/2)-pd->page_size.w/2; + efl_gfx_entity_geometry_set(pd->clipper, goal); efl_gfx_entity_geometry_set(entity, goal); } @@ -48,8 +50,15 @@ _efl_ui_spotlight_manager_plain_efl_ui_spotlight_manager_bind(Eo *obj, Efl_Ui_Sp pd->container = spotlight; + pd->clipper = efl_add(EFL_CANVAS_RECTANGLE_CLASS, + evas_object_evas_get(spotlight)); + evas_object_static_clip_set(pd->clipper, EINA_TRUE); + efl_canvas_group_member_add(spotlight, pd->clipper); + for (int i = 0; i < efl_content_count(spotlight) ; ++i) { Efl_Gfx_Entity *elem = efl_pack_content_get(spotlight, i); + efl_key_data_set(elem, "_elm_leaveme", spotlight); + efl_canvas_object_clipper_set(elem, pd->clipper); efl_canvas_group_member_add(pd->container, elem); efl_gfx_entity_visible_set(elem, EINA_FALSE); } @@ -81,6 +90,8 @@ _content_changed(Eo *obj, Efl_Ui_Spotlight_Manager_Plain_Data *pd) EOLIAN static void _efl_ui_spotlight_manager_plain_efl_ui_spotlight_manager_content_add(Eo *obj, Efl_Ui_Spotlight_Manager_Plain_Data *pd, Efl_Gfx_Entity *subobj, int index EINA_UNUSED) { + efl_key_data_set(subobj, "_elm_leaveme", pd->container); + efl_canvas_object_clipper_set(subobj, pd->clipper); efl_canvas_group_member_add(pd->container, subobj); efl_gfx_entity_visible_set(subobj, EINA_FALSE); _content_changed(obj, pd); @@ -89,6 +100,8 @@ _efl_ui_spotlight_manager_plain_efl_ui_spotlight_manager_content_add(Eo *obj, Ef EOLIAN static void _efl_ui_spotlight_manager_plain_efl_ui_spotlight_manager_content_del(Eo *obj, Efl_Ui_Spotlight_Manager_Plain_Data *pd, Efl_Gfx_Entity *subobj, int index EINA_UNUSED) { + efl_key_data_set(subobj, "_elm_leaveme", NULL); + efl_canvas_object_clipper_set(subobj, NULL); efl_canvas_group_member_remove(pd->container, subobj); if (pd->current_content == subobj) pd->current_content = NULL; @@ -147,5 +160,17 @@ _efl_ui_spotlight_manager_plain_efl_ui_spotlight_manager_animated_transition_get return pd->animation; } +EOLIAN static void +_efl_ui_spotlight_manager_plain_efl_object_invalidate(Eo *obj, Efl_Ui_Spotlight_Manager_Plain_Data *pd) +{ + efl_del(pd->clipper); + + for (int i = 0; i < efl_content_count(pd->container); ++i) + { + efl_canvas_object_clipper_set(efl_pack_content_get(pd->container, i), NULL); + } + + efl_invalidate(efl_super(obj, MY_CLASS)); +} #include "efl_ui_spotlight_manager_plain.eo.c" diff --git a/src/lib/elementary/efl_ui_spotlight_manager_plain.eo b/src/lib/elementary/efl_ui_spotlight_manager_plain.eo index fd4f5d9664..23bf0e443e 100644 --- a/src/lib/elementary/efl_ui_spotlight_manager_plain.eo +++ b/src/lib/elementary/efl_ui_spotlight_manager_plain.eo @@ -8,5 +8,6 @@ class @beta Efl.Ui.Spotlight.Manager_Plain extends Efl.Ui.Spotlight.Manager Efl.Ui.Spotlight.Manager.size {set;} Efl.Ui.Spotlight.Manager.animated_transition {set; get;} Efl.Object.destructor; + Efl.Object.invalidate; } } diff --git a/src/lib/elementary/efl_ui_spotlight_manager_scroll.c b/src/lib/elementary/efl_ui_spotlight_manager_scroll.c index 1b5d974176..267b64471b 100644 --- a/src/lib/elementary/efl_ui_spotlight_manager_scroll.c +++ b/src/lib/elementary/efl_ui_spotlight_manager_scroll.c @@ -185,6 +185,7 @@ _efl_ui_spotlight_manager_scroll_efl_ui_spotlight_manager_bind(Eo *obj, Efl_Ui_S for (int i = 0; i < efl_content_count(spotlight) ; ++i) { Efl_Gfx_Entity *elem = efl_pack_content_get(spotlight, i); + efl_key_data_set(elem, "_elm_leaveme", spotlight); efl_canvas_object_clipper_set(elem, pd->backclip); efl_canvas_group_member_add(pd->container, elem); efl_gfx_entity_visible_set(elem, EINA_TRUE); @@ -197,6 +198,7 @@ _efl_ui_spotlight_manager_scroll_efl_ui_spotlight_manager_bind(Eo *obj, Efl_Ui_S EOLIAN static void _efl_ui_spotlight_manager_scroll_efl_ui_spotlight_manager_content_add(Eo *obj EINA_UNUSED, Efl_Ui_Spotlight_Manager_Scroll_Data *pd, Efl_Gfx_Entity *subobj, int index EINA_UNUSED) { + efl_key_data_set(subobj, "_elm_leaveme", pd->container); efl_gfx_entity_visible_set(subobj, EINA_TRUE); efl_canvas_object_clipper_set(subobj, pd->backclip); efl_canvas_group_member_add(pd->container, subobj); @@ -209,6 +211,7 @@ _efl_ui_spotlight_manager_scroll_efl_ui_spotlight_manager_content_add(Eo *obj EI EOLIAN static void _efl_ui_spotlight_manager_scroll_efl_ui_spotlight_manager_content_del(Eo *obj EINA_UNUSED, Efl_Ui_Spotlight_Manager_Scroll_Data *pd, Efl_Gfx_Entity *subobj, int index EINA_UNUSED) { + efl_key_data_set(subobj, "_elm_leaveme", NULL); efl_canvas_object_clipper_set(subobj, NULL); efl_canvas_group_member_remove(pd->container, subobj); diff --git a/src/lib/elementary/efl_ui_spotlight_manager_stack.c b/src/lib/elementary/efl_ui_spotlight_manager_stack.c index 26965326a3..dccef97cdc 100644 --- a/src/lib/elementary/efl_ui_spotlight_manager_stack.c +++ b/src/lib/elementary/efl_ui_spotlight_manager_stack.c @@ -10,6 +10,7 @@ typedef struct { Efl_Ui_Spotlight_Container * container; Efl_Canvas_Animation_Player *alpha_anim; Efl_Gfx_Entity *content[2]; + Efl_Gfx_Entity *clipper; int ids[2]; //only used when in animation Eina_Size2D page_size; Eina_Bool animation; @@ -25,6 +26,7 @@ _geom_sync(Eo *obj EINA_UNUSED, Efl_Ui_Spotlight_Manager_Stack_Data *pd) goal.size = pd->page_size; goal.y = (group_pos.y + group_pos.h/2)-pd->page_size.h/2; goal.x = (group_pos.x + group_pos.w/2)-pd->page_size.w/2; + efl_gfx_entity_geometry_set(pd->clipper, goal); for (int i = 0; i < 2; ++i) { if (pd->content[i]) @@ -62,12 +64,19 @@ _efl_ui_spotlight_manager_stack_efl_ui_spotlight_manager_bind(Eo *obj, Efl_Ui_Sp { pd->container = spotlight; + pd->clipper = efl_add(EFL_CANVAS_RECTANGLE_CLASS, + evas_object_evas_get(pd->container)); + evas_object_static_clip_set(pd->clipper, EINA_TRUE); + efl_canvas_group_member_add(spotlight, pd->clipper); + pd->alpha_anim = efl_add(EFL_CANVAS_ALPHA_ANIMATION_CLASS, obj); efl_animation_alpha_set(pd->alpha_anim, 0.0, 1.0); efl_animation_duration_set(pd->alpha_anim, 0.5); for (int i = 0; i < efl_content_count(spotlight) ; ++i) { Efl_Gfx_Entity *elem = efl_pack_content_get(spotlight, i); + efl_key_data_set(elem, "_elm_leaveme", spotlight); + efl_canvas_object_clipper_set(elem, pd->clipper); efl_canvas_group_member_add(pd->container, elem); efl_gfx_entity_visible_set(elem, EINA_FALSE); } @@ -95,6 +104,8 @@ _update_ids(Eo *obj, Efl_Ui_Spotlight_Manager_Stack_Data *pd, int avoid_index) EOLIAN static void _efl_ui_spotlight_manager_stack_efl_ui_spotlight_manager_content_add(Eo *obj EINA_UNUSED, Efl_Ui_Spotlight_Manager_Stack_Data *pd, Efl_Gfx_Entity *subobj, int index EINA_UNUSED) { + efl_key_data_set(subobj, "_elm_leaveme", pd->container); + efl_canvas_object_clipper_set(subobj, pd->clipper); efl_canvas_group_member_add(pd->container, subobj); efl_gfx_entity_visible_set(subobj, EINA_FALSE); _update_ids(obj, pd, -1); @@ -103,6 +114,8 @@ _efl_ui_spotlight_manager_stack_efl_ui_spotlight_manager_content_add(Eo *obj EIN EOLIAN static void _efl_ui_spotlight_manager_stack_efl_ui_spotlight_manager_content_del(Eo *obj EINA_UNUSED, Efl_Ui_Spotlight_Manager_Stack_Data *pd, Efl_Gfx_Entity *subobj, int index) { + efl_key_data_set(subobj, "_elm_leaveme", NULL); + efl_canvas_object_clipper_set(subobj, NULL); efl_canvas_group_member_remove(pd->container, subobj); for (int i = 0; i < 2; ++i) { @@ -169,10 +182,12 @@ _efl_ui_spotlight_manager_stack_efl_ui_spotlight_manager_size_set(Eo *obj, Efl_U } EOLIAN static void -_efl_ui_spotlight_manager_stack_efl_object_invalidate(Eo *obj, Efl_Ui_Spotlight_Manager_Stack_Data *pd EINA_UNUSED) +_efl_ui_spotlight_manager_stack_efl_object_invalidate(Eo *obj, Efl_Ui_Spotlight_Manager_Stack_Data *pd) { efl_invalidate(efl_super(obj, MY_CLASS)); + efl_del(pd->clipper); + for (int i = 0; i < efl_content_count(pd->container); ++i) { Efl_Gfx_Stack *elem = efl_pack_content_get(pd->container, i); @@ -180,6 +195,8 @@ _efl_ui_spotlight_manager_stack_efl_object_invalidate(Eo *obj, Efl_Ui_Spotlight_ { efl_gfx_mapping_color_set(elem, d, 255, 255, 255, 255); } + + efl_canvas_object_clipper_set(elem, NULL); } }