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);
      }
 }
 

-- 


Reply via email to