jaehyun pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=a1350a0e3ea3ae51160ec1d9f95e4cf7346b0acc
commit a1350a0e3ea3ae51160ec1d9f95e4cf7346b0acc Author: Jaehyun Cho <jae_hyun....@samsung.com> Date: Tue Jan 21 19:32:34 2020 +0900 efl_ui_spotlight_manager: fix not to change sub objects' color Summary: Widget's group_member_add() sets its sub objects' color with the parent's color. Since spotlight managers call group_member_add() with spotlight container and its sub objects, the sub objects' color can be changed. e.g. packed rectangle's color is changed to white (default color value) To resolve the above issue, spotlight managers set data "_elm_leaveme" before calling group_member_add() not to change sub objects' color. Reviewers: bu5hm4n Reviewed By: bu5hm4n Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D11134 --- .../elementary/efl_ui_spotlight_manager_plain.c | 25 ++++++++++++++++++++++ .../elementary/efl_ui_spotlight_manager_plain.eo | 1 + .../elementary/efl_ui_spotlight_manager_scroll.c | 3 +++ .../elementary/efl_ui_spotlight_manager_stack.c | 19 +++++++++++++++- 4 files changed, 47 insertions(+), 1 deletion(-) 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); } } --