evas: Move all overrides to std smart object

- color_set
- visible_set
- position_set
- no_render_set
- member_add, member_del
- group_add, group_del
- clip_set

Notes:
 - Widget overrides color_set without calling super() which means that
   color_get() returns a different value. Also any subsequent child
   object add will not inherit the color.
 - Smart clipped objects also don't call super.

This patch changes that, but only for smart clipped objects created
through EO. This shouldn't have any side effect.
This commit is contained in:
Jean-Philippe Andre 2017-09-06 10:31:08 +09:00
parent 67798ca863
commit 71e122424e
4 changed files with 138 additions and 110 deletions

View File

@ -52,6 +52,7 @@ class Efl.Canvas.Group (Efl.Canvas.Object)
]]
legacy: evas_object_smart_calculate;
}
/* FIXME: children -> members? */
group_children_iterate @const {
[[Returns an iterator over the children of this object, that are
canvas objects.
@ -103,6 +104,10 @@ class Efl.Canvas.Group (Efl.Canvas.Object)
Efl.Object.constructor;
Efl.Object.destructor;
Efl.Object.debug_name_override;
Efl.Gfx.color { set; }
Efl.Gfx.visible { set; }
Efl.Gfx.position { set; }
Efl.Canvas.Object.clip { set; }
Efl.Canvas.Object.no_render { set; }
Efl.Canvas.Object.paragraph_direction { get; set; }
}

View File

@ -6,12 +6,5 @@ abstract Efl.Canvas.Group.Clipped (Efl.Canvas.Group)
data: null;
implements {
Efl.Object.constructor;
Efl.Gfx.color { set; }
Efl.Gfx.visible { set; }
Efl.Gfx.position { set; }
Efl.Canvas.Object.clip { set; }
Efl.Canvas.Object.no_render { set; }
Efl.Canvas.Group.group_member_del;
Efl.Canvas.Group.group_member_add;
}
}

View File

@ -50,6 +50,7 @@ struct _Evas_Smart_Data
Eina_Bool group_del_called : 1;
Eina_Bool unclipped : 1; /* If true, NOT a smart_clipped object */
Eina_Bool data_nofree : 1; /* If true, do NOT free the data */
Eina_Bool constructed : 1; /* constructor finished */
};
typedef struct
@ -78,7 +79,6 @@ _eo_evas_smart_cb(void *data, const Efl_Event *event)
}
/* private methods for smart objects */
static inline void evas_object_smart_init(Evas_Object *eo_obj);
static void evas_object_smart_render(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data,
@ -125,6 +125,13 @@ static const Evas_Object_Func object_func =
NULL
};
/* helpers */
static inline Evas_Object *
_smart_clipper_get(Evas_Smart_Data *o)
{
Evas_Object_Smart_Clipped_Data *cso = (!o->unclipped) ? o->data : NULL;
return cso ? cso->clipper : NULL;
}
/* public funcs */
EAPI void
@ -287,6 +294,17 @@ _efl_canvas_group_group_member_add(Eo *smart_obj, Evas_Smart_Data *o, Evas_Objec
if (!smart->is_frame_top && (smart->is_frame != obj->is_frame))
efl_canvas_object_is_frame_object_set(eo_obj, smart->is_frame);
if (!o->unclipped && o->constructed)
{
Evas_Object *clipper = _smart_clipper_get(o);
Eina_Bool had_clippees = efl_canvas_object_clipees_has(clipper);
EINA_SAFETY_ON_NULL_RETURN(clipper);
efl_canvas_object_clip_set(eo_obj, clipper);
if (!had_clippees && smart->cur->visible)
efl_gfx_visible_set(clipper, 1);
}
evas_object_change(eo_obj, obj);
evas_object_mapped_clip_across_mark(eo_obj, obj);
if (smart->smart.smart && smart->smart.smart->smart_class->member_add)
@ -308,16 +326,29 @@ EOLIAN static void
_efl_canvas_group_group_member_del(Eo *smart_obj, Evas_Smart_Data *_pd EINA_UNUSED, Evas_Object *eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_safe_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Evas_Smart_Data *member_o;
Evas_Object_Protected_Data *smart;
Evas_Smart_Data *member_o, *o;
if (!obj || !obj->smart.parent) return;
evas_object_async_block(obj);
Evas_Object_Protected_Data *smart = efl_data_scope_get(smart_obj, EFL_CANVAS_OBJECT_CLASS);
smart = efl_data_scope_get(smart_obj, EFL_CANVAS_OBJECT_CLASS);
if (smart->smart.smart && smart->smart.smart->smart_class->member_del)
smart->smart.smart->smart_class->member_del(smart_obj, eo_obj);
Evas_Smart_Data *o = efl_data_scope_get(smart_obj, MY_CLASS);
o = efl_data_scope_get(smart_obj, MY_CLASS);
if (!o->unclipped)
{
Evas_Object *clipper = _smart_clipper_get(o);
EINA_SAFETY_ON_NULL_RETURN(clipper);
efl_canvas_object_clip_set(eo_obj, NULL);
if (!efl_canvas_object_clipees_has(clipper))
efl_gfx_visible_set(clipper, 0);
}
o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(obj));
o->member_count--;
obj->smart.parent = NULL;
@ -526,11 +557,18 @@ evas_object_smart_members_get_direct(const Evas_Object *eo_obj)
static void
_efl_canvas_group_group_members_all_del_internal(Evas_Smart_Data *o)
{;
{
Evas_Object_Protected_Data *memobj;
Eina_Inlist *itrn;
Eo *eo_clipper;
eo_clipper = _smart_clipper_get(o);
EINA_INLIST_FOREACH_SAFE(o->contained, itrn, memobj)
efl_del(memobj->object);
{
if (memobj->object != eo_clipper)
efl_del(memobj->object);
}
efl_del(eo_clipper);
o->group_del_called = EINA_TRUE;
}
@ -625,15 +663,25 @@ evas_object_smart_add(Evas *eo_e, Evas_Smart *s)
EOLIAN static Eo *
_efl_canvas_group_efl_object_constructor(Eo *eo_obj, Evas_Smart_Data *sd)
{
Evas_Object_Protected_Data *obj;
sd->object = eo_obj;
sd->inherit_paragraph_direction = EINA_TRUE;
eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
evas_object_smart_init(eo_obj);
EINA_SAFETY_ON_NULL_RETURN_VAL(eo_obj, NULL);
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
obj->is_smart = EINA_TRUE;
obj->func = &object_func;
obj->private_data = efl_data_ref(eo_obj, MY_CLASS);
if (!sd->unclipped)
_evas_object_smart_clipped_init(eo_obj);
efl_canvas_object_type_set(eo_obj, MY_CLASS_NAME_LEGACY);
efl_canvas_group_add(eo_obj);
sd->constructed = EINA_TRUE;
return eo_obj;
}
@ -743,17 +791,8 @@ _evas_object_smart_clipped_init(Evas_Object *eo_obj)
}
EOLIAN static void
_efl_canvas_group_group_add(Eo *eo_obj, Evas_Smart_Data *o)
_efl_canvas_group_group_add(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *o EINA_UNUSED)
{
// We shouldn't reach this function in case of legacy API.
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
EINA_SAFETY_ON_FALSE_RETURN(!obj->smart.smart);
if (!o->unclipped)
{
if (!o->data) o->unclipped = EINA_TRUE;
else _evas_object_smart_clipped_init(eo_obj);
}
}
EOLIAN static void
@ -761,31 +800,96 @@ _efl_canvas_group_group_del(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *o)
{
if (!o->unclipped)
{
Evas_Object_Smart_Clipped_Data *cso = o->data;
Eo *clipper;
if (cso && cso->clipper)
{
clipper = cso->clipper;
cso->clipper = NULL;
evas_object_del(clipper);
}
_efl_canvas_group_group_members_all_del_internal(o);
}
o->group_del_called = EINA_TRUE;
}
EOLIAN static void
_efl_canvas_group_efl_canvas_object_no_render_set(Eo *eo_obj, Evas_Smart_Data *o EINA_UNUSED, Eina_Bool enable)
_efl_canvas_group_efl_canvas_object_no_render_set(Eo *eo_obj, Evas_Smart_Data *o, Eina_Bool enable)
{
Evas_Object_Protected_Data *obj2;
Eo *clipper;
enable = !!enable;
if (efl_canvas_object_no_render_get(eo_obj) == enable) return;
efl_canvas_object_no_render_set(efl_super(eo_obj, MY_CLASS), enable);
EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(eo_obj), obj2)
efl_canvas_object_no_render_set(obj2->object, enable);
clipper = (!o->unclipped) ? _smart_clipper_get(o) : NULL;
EINA_INLIST_FOREACH(o->contained, obj2)
{
if (obj2->object != clipper)
efl_canvas_object_no_render_set(obj2->object, enable);
}
}
EOLIAN static void
_efl_canvas_group_efl_gfx_color_set(Eo *eo_obj, Evas_Smart_Data *o, int r, int g, int b, int a)
{
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_COLOR_SET, 0, r, g, b, a))
return;
efl_gfx_color_set(efl_super(eo_obj, MY_CLASS), r, g, b, a);
if (!o->unclipped)
{
Evas_Object *clipper = _smart_clipper_get(o);
EINA_SAFETY_ON_NULL_RETURN(clipper);
efl_gfx_color_set(clipper, r, g, b, a);
// Note: Legacy impl (and Widget) didn't call super in this case...
}
}
EOLIAN static void
_efl_canvas_group_efl_gfx_visible_set(Eo *eo_obj, Evas_Smart_Data *o, Eina_Bool vis)
{
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_VISIBLE, 0, vis))
return;
efl_gfx_visible_set(efl_super(eo_obj, MY_CLASS), vis);
if (!o->unclipped)
{
Evas_Object *clipper = _smart_clipper_get(o);
EINA_SAFETY_ON_NULL_RETURN(clipper);
// note: maybe this is not necessary with no_render set on the clipper
if (vis && !evas_object_clipees_has(clipper))
return;
efl_gfx_visible_set(clipper, vis);
}
}
EOLIAN static void
_efl_canvas_group_efl_gfx_position_set(Eo *eo_obj, Evas_Smart_Data *o, Evas_Coord x, Evas_Coord y)
{
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, x, y))
return;
if (!o->unclipped)
_evas_object_smart_clipped_smart_move_internal(eo_obj, x, y);
efl_gfx_position_set(efl_super(eo_obj, MY_CLASS), x, y);
}
EOLIAN static void
_efl_canvas_group_efl_canvas_object_clip_set(Eo *eo_obj, Evas_Smart_Data *o, Evas_Object *clip)
{
EINA_SAFETY_ON_FALSE_RETURN(!clip || efl_isa(clip, EFL_CANVAS_OBJECT_CLASS));
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_SET, 0, clip))
return;
efl_canvas_object_clip_set(efl_super(eo_obj, MY_CLASS), clip);
if (!o->unclipped)
{
Evas_Object *clipper = _smart_clipper_get(o);
EINA_SAFETY_ON_NULL_RETURN(clipper);
efl_canvas_object_clip_set(clipper, clip);
}
}
void
@ -1581,16 +1685,6 @@ evas_object_smart_bounding_box_update(Evas_Object_Protected_Data *obj)
}
/* all nice and private */
static inline void
evas_object_smart_init(Evas_Object *eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
obj->is_smart = EINA_TRUE;
/* set up methods (compulsory) */
obj->func = &object_func;
obj->private_data = efl_data_ref(eo_obj, MY_CLASS);
}
static void
evas_object_smart_render(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj EINA_UNUSED, void *type_private_data EINA_UNUSED, void *engine EINA_UNUSED, void *output EINA_UNUSED, void *context EINA_UNUSED, void *surface EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, Eina_Bool do_async EINA_UNUSED)
{
@ -1746,5 +1840,4 @@ EOAPI EFL_VOID_FUNC_BODYV(efl_canvas_group_unclipped_set, EFL_FUNC_CALL(enable),
EFL_OBJECT_OP_FUNC(efl_canvas_group_del, _efl_canvas_group_group_del), \
EFL_OBJECT_OP_FUNC(efl_canvas_group_unclipped_set, _efl_canvas_group_group_unclipped_set)
#include "canvas/efl_canvas_group.eo.c"

View File

@ -49,16 +49,6 @@ evas_object_smart_clipped_smart_move(Evas_Object *eo_obj, Evas_Coord x, Evas_Coo
_evas_object_smart_clipped_smart_move_internal(eo_obj, x, y);
}
EOLIAN static void
_efl_canvas_group_clipped_efl_gfx_position_set(Eo *eo_obj, void *_pd EINA_UNUSED, Evas_Coord x, Evas_Coord y)
{
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, x, y))
return;
_evas_object_smart_clipped_smart_move_internal(eo_obj, x, y);
efl_gfx_position_set(efl_super(eo_obj, MY_CLASS), x, y);
}
static void
evas_object_smart_clipped_smart_show(Evas_Object *eo_obj)
{
@ -74,28 +64,6 @@ evas_object_smart_clipped_smart_hide(Evas_Object *eo_obj)
evas_object_hide(cso->clipper);
}
EOLIAN static void
_efl_canvas_group_clipped_efl_gfx_visible_set(Eo *eo_obj, void *_pd EINA_UNUSED, Eina_Bool vis)
{
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_VISIBLE, 0, vis))
return;
efl_gfx_visible_set(efl_super(eo_obj, MY_CLASS), vis);
if (vis) evas_object_smart_clipped_smart_show(eo_obj);
else evas_object_smart_clipped_smart_hide(eo_obj);
}
EOLIAN static void
_efl_canvas_group_clipped_efl_canvas_object_no_render_set(Eo *eo_obj, void *_pd EINA_UNUSED, Eina_Bool enable)
{
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
enable = !!enable;
if (efl_canvas_object_no_render_get(eo_obj) == enable) return;
efl_canvas_object_no_render_set(efl_super(eo_obj, MY_CLASS), enable);
efl_canvas_object_no_render_set(cso->clipper, 1);
}
static void
evas_object_smart_clipped_smart_color_set(Evas_Object *eo_obj, int r, int g, int b, int a)
{
@ -103,12 +71,6 @@ evas_object_smart_clipped_smart_color_set(Evas_Object *eo_obj, int r, int g, int
evas_object_color_set(cso->clipper, r, g, b, a);
}
EOLIAN static void
_efl_canvas_group_clipped_efl_gfx_color_set(Eo *eo_obj, void *_pd EINA_UNUSED, int r, int g, int b, int a)
{
evas_object_smart_clipped_smart_color_set(eo_obj, r, g, b, a);
}
static void
evas_object_smart_clipped_smart_clip_set(Evas_Object *eo_obj, Evas_Object *clip)
{
@ -123,17 +85,6 @@ evas_object_smart_clipped_smart_clip_unset(Evas_Object *eo_obj)
evas_object_clip_unset(cso->clipper);
}
EOLIAN static void
_efl_canvas_group_clipped_efl_canvas_object_clip_set(Eo *eo_obj, void *_pd EINA_UNUSED, Evas_Object *clip)
{
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_SET, 0, clip))
return;
efl_canvas_object_clip_set(efl_super(eo_obj, MY_CLASS), clip);
if (clip) evas_object_smart_clipped_smart_clip_set(eo_obj, clip);
else evas_object_smart_clipped_smart_clip_unset(eo_obj);
}
static void
evas_object_smart_clipped_smart_member_add(Evas_Object *eo_obj, Evas_Object *member)
{
@ -145,13 +96,6 @@ evas_object_smart_clipped_smart_member_add(Evas_Object *eo_obj, Evas_Object *mem
evas_object_show(cso->clipper);
}
EOLIAN static void
_efl_canvas_group_clipped_efl_canvas_group_group_member_add(Eo *eo_obj, void *_pd EINA_UNUSED, Evas_Object *member)
{
efl_canvas_group_member_add(efl_super(eo_obj, MY_CLASS), member);
evas_object_smart_clipped_smart_member_add(eo_obj, member);
}
static void
evas_object_smart_clipped_smart_member_del(Evas_Object *eo_obj, Evas_Object *member)
{
@ -163,13 +107,6 @@ evas_object_smart_clipped_smart_member_del(Evas_Object *eo_obj, Evas_Object *mem
evas_object_hide(cso->clipper);
}
EOLIAN static void
_efl_canvas_group_clipped_efl_canvas_group_group_member_del(Eo *eo_obj, void *_pd EINA_UNUSED, Evas_Object *member)
{
evas_object_smart_clipped_smart_member_del(eo_obj, member);
efl_canvas_group_member_del(efl_super(eo_obj, MY_CLASS), member);
}
EOLIAN static Eo *
_efl_canvas_group_clipped_efl_object_constructor(Eo *eo_obj, void *_pd EINA_UNUSED)
{