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
This commit is contained in:
Jaehyun Cho 2020-01-21 19:32:34 +09:00
parent 7311b6fe32
commit a1350a0e3e
4 changed files with 47 additions and 1 deletions

View File

@ -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"

View File

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

View File

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

View File

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