2016-10-11 19:31:17 -07:00
|
|
|
#define EFL_CANVAS_GROUP_PROTECTED
|
|
|
|
#define EFL_CANVAS_GROUP_BETA
|
|
|
|
|
2013-06-20 03:53:29 -07:00
|
|
|
#include "evas_common_private.h"
|
2008-10-01 08:42:48 -07:00
|
|
|
#include "evas_private.h"
|
2008-09-06 19:10:17 -07:00
|
|
|
|
2016-06-17 01:26:08 -07:00
|
|
|
#define MY_CLASS EFL_CANVAS_GROUP_CLIPPED_CLASS
|
2012-10-08 18:58:41 -07:00
|
|
|
|
|
|
|
#define CSO_DATA_GET(eo_obj, ptr) \
|
2016-08-15 06:44:41 -07:00
|
|
|
Evas_Object_Smart_Clipped_Data *ptr = (efl_isa(eo_obj, MY_CLASS) ? \
|
|
|
|
efl_data_scope_get(eo_obj, MY_CLASS) : \
|
2012-10-08 18:58:41 -07:00
|
|
|
evas_object_smart_data_get(eo_obj));
|
|
|
|
|
2016-10-13 01:59:13 -07:00
|
|
|
#define CSO_DATA_GET_OR_RETURN(eo_obj, ptr, ...) \
|
|
|
|
CSO_DATA_GET(eo_obj, ptr) \
|
|
|
|
if (!ptr) return __VA_ARGS__;
|
2008-09-06 19:10:17 -07:00
|
|
|
|
2016-06-16 23:32:37 -07:00
|
|
|
EAPI Evas_Object *
|
|
|
|
evas_object_smart_clipped_clipper_get(const Evas_Object *eo_obj)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2016-10-13 01:59:13 -07:00
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso, NULL);
|
2016-06-16 23:32:37 -07:00
|
|
|
|
2016-10-13 01:59:13 -07:00
|
|
|
return cso->clipper;
|
2008-09-06 19:10:17 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-10-08 18:58:41 -07:00
|
|
|
evas_object_smart_clipped_smart_add(Evas_Object *eo_obj)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2008-10-24 19:49:19 -07:00
|
|
|
Evas_Object *clipper;
|
2008-09-06 19:10:17 -07:00
|
|
|
|
2012-10-08 18:58:41 -07:00
|
|
|
CSO_DATA_GET(eo_obj, cso)
|
2008-09-06 19:10:17 -07:00
|
|
|
if (!cso)
|
2010-11-26 02:01:18 -08:00
|
|
|
cso = calloc(1, sizeof(*cso)); /* users can provide it or realloc() later */
|
2008-09-06 19:10:17 -07:00
|
|
|
|
2012-10-08 18:58:41 -07:00
|
|
|
cso->evas = evas_object_evas_get(eo_obj);
|
2008-10-24 19:49:19 -07:00
|
|
|
clipper = evas_object_rectangle_add(cso->evas);
|
2010-09-02 17:06:56 -07:00
|
|
|
evas_object_static_clip_set(clipper, 1);
|
2008-10-24 19:49:19 -07:00
|
|
|
cso->clipper = NULL;
|
2012-10-08 18:58:41 -07:00
|
|
|
evas_object_smart_member_add(clipper, eo_obj);
|
2008-10-24 19:49:19 -07:00
|
|
|
cso->clipper = clipper;
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_color_set(cso->clipper, 255, 255, 255, 255);
|
2009-10-09 12:17:55 -07:00
|
|
|
evas_object_move(cso->clipper, -100000, -100000);
|
|
|
|
evas_object_resize(cso->clipper, 200000, 200000);
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_pass_events_set(cso->clipper, 1);
|
|
|
|
evas_object_hide(cso->clipper); /* show when have something clipped to it */
|
2016-06-20 21:26:15 -07:00
|
|
|
efl_canvas_object_no_render_set(cso->clipper, 1);
|
2008-09-06 19:10:17 -07:00
|
|
|
|
2012-10-08 18:58:41 -07:00
|
|
|
evas_object_smart_data_set(eo_obj, cso);
|
|
|
|
}
|
|
|
|
|
2014-03-10 08:06:46 -07:00
|
|
|
EOLIAN static void
|
2016-06-17 01:26:08 -07:00
|
|
|
_efl_canvas_group_clipped_efl_canvas_group_group_add(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED)
|
2012-10-08 18:58:41 -07:00
|
|
|
{
|
|
|
|
evas_object_smart_clipped_smart_add(eo_obj);
|
2008-09-06 19:10:17 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-10-08 18:58:41 -07:00
|
|
|
evas_object_smart_clipped_smart_del(Evas_Object *eo_obj)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2012-10-08 18:58:41 -07:00
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
|
2009-09-22 15:37:03 -07:00
|
|
|
|
2008-10-24 19:49:19 -07:00
|
|
|
if (cso->clipper)
|
|
|
|
{
|
2012-05-23 23:48:25 -07:00
|
|
|
Evas_Object *clipper = cso->clipper;
|
|
|
|
cso->clipper = NULL;
|
|
|
|
evas_object_del(clipper);
|
2008-10-24 19:49:19 -07:00
|
|
|
}
|
|
|
|
|
2016-06-17 01:26:08 -07:00
|
|
|
_efl_canvas_group_group_members_all_del(eo_obj);
|
2012-10-08 18:58:41 -07:00
|
|
|
|
2013-01-05 04:14:41 -08:00
|
|
|
/* If it's a legacy smart object, we should free the cso. */
|
2016-08-15 06:44:41 -07:00
|
|
|
if (!efl_isa(eo_obj, MY_CLASS))
|
2013-01-05 04:14:41 -08:00
|
|
|
free(cso);
|
|
|
|
|
2012-10-08 18:58:41 -07:00
|
|
|
evas_object_smart_data_set(eo_obj, NULL);
|
|
|
|
}
|
2008-09-06 19:10:17 -07:00
|
|
|
|
2014-03-10 08:06:46 -07:00
|
|
|
EOLIAN static void
|
2016-06-17 01:26:08 -07:00
|
|
|
_efl_canvas_group_clipped_efl_canvas_group_group_del(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED)
|
2012-10-08 18:58:41 -07:00
|
|
|
{
|
|
|
|
evas_object_smart_clipped_smart_del(eo_obj);
|
2017-02-15 03:07:11 -08:00
|
|
|
// group_del_called was already set to true, no need to call super here.
|
2008-09-06 19:10:17 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-10-08 18:58:41 -07:00
|
|
|
evas_object_smart_clipped_smart_move(Evas_Object *eo_obj, Evas_Coord x, Evas_Coord y)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2017-02-20 00:59:50 -08:00
|
|
|
if (!efl_isa(eo_obj, EFL_CANVAS_GROUP_CLASS)) return;
|
|
|
|
_evas_object_smart_clipped_smart_move_internal(eo_obj, x, y);
|
2008-09-06 19:10:17 -07:00
|
|
|
}
|
|
|
|
|
2014-03-10 08:06:46 -07:00
|
|
|
EOLIAN static void
|
2016-10-10 20:39:05 -07:00
|
|
|
_efl_canvas_group_clipped_efl_gfx_position_set(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED, Evas_Coord x, Evas_Coord y)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2016-10-10 20:39:05 -07:00
|
|
|
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, x, y))
|
|
|
|
return;
|
|
|
|
|
2017-02-20 00:59:50 -08:00
|
|
|
_evas_object_smart_clipped_smart_move_internal(eo_obj, x, y);
|
2016-10-10 20:39:05 -07:00
|
|
|
efl_gfx_position_set(efl_super(eo_obj, MY_CLASS), x, y);
|
2012-10-08 18:58:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2016-10-10 02:59:42 -07:00
|
|
|
evas_object_smart_clipped_smart_show(Evas_Object *eo_obj)
|
2012-10-08 18:58:41 -07:00
|
|
|
{
|
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
|
2013-04-10 21:21:54 -07:00
|
|
|
if (evas_object_clipees_has(cso->clipper))
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_show(cso->clipper); /* just show if clipper being used */
|
|
|
|
}
|
|
|
|
|
2012-10-08 18:58:41 -07:00
|
|
|
static void
|
2016-10-10 02:59:42 -07:00
|
|
|
evas_object_smart_clipped_smart_hide(Evas_Object *eo_obj)
|
2012-10-08 18:58:41 -07:00
|
|
|
{
|
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_hide(cso->clipper);
|
|
|
|
}
|
|
|
|
|
2014-03-10 08:06:46 -07:00
|
|
|
EOLIAN static void
|
2016-10-10 02:59:42 -07:00
|
|
|
_efl_canvas_group_clipped_efl_gfx_visible_set(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED, Eina_Bool vis)
|
2012-10-08 18:58:41 -07:00
|
|
|
{
|
2016-10-10 02:59:42 -07:00
|
|
|
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);
|
2012-10-08 18:58:41 -07:00
|
|
|
}
|
|
|
|
|
2016-09-06 04:02:34 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_efl_canvas_group_clipped_efl_canvas_object_no_render_set(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *cso, Eina_Bool enable)
|
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2012-10-08 18:58:41 -07:00
|
|
|
static void
|
|
|
|
evas_object_smart_clipped_smart_color_set(Evas_Object *eo_obj, int r, int g, int b, int a)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2012-10-08 18:58:41 -07:00
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_color_set(cso->clipper, r, g, b, a);
|
|
|
|
}
|
|
|
|
|
2014-03-10 08:06:46 -07:00
|
|
|
EOLIAN static void
|
2016-10-07 00:25:49 -07:00
|
|
|
_efl_canvas_group_clipped_efl_gfx_color_set(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED, int r, int g, int b, int a)
|
2012-10-08 18:58:41 -07:00
|
|
|
{
|
|
|
|
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)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2012-10-08 18:58:41 -07:00
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_clip_set(cso->clipper, clip);
|
|
|
|
}
|
|
|
|
|
2012-10-08 18:58:41 -07:00
|
|
|
static void
|
|
|
|
evas_object_smart_clipped_smart_clip_unset(Evas_Object *eo_obj)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2012-10-08 18:58:41 -07:00
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_clip_unset(cso->clipper);
|
|
|
|
}
|
|
|
|
|
2014-03-10 08:06:46 -07:00
|
|
|
EOLIAN static void
|
2016-10-10 00:44:48 -07:00
|
|
|
_efl_canvas_group_clipped_efl_canvas_object_clip_set(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED, Evas_Object *clip)
|
2012-10-08 18:58:41 -07:00
|
|
|
{
|
2016-11-07 21:47:50 -08:00
|
|
|
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);
|
2012-10-08 18:58:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
evas_object_smart_clipped_smart_member_add(Evas_Object *eo_obj, Evas_Object *member)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2012-10-08 18:58:41 -07:00
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
|
2012-08-07 03:44:15 -07:00
|
|
|
if (!cso->clipper || member == cso->clipper)
|
2008-10-24 19:49:19 -07:00
|
|
|
return;
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_clip_set(member, cso->clipper);
|
2012-10-08 18:58:41 -07:00
|
|
|
if (evas_object_visible_get(eo_obj))
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_show(cso->clipper);
|
|
|
|
}
|
|
|
|
|
2014-03-10 08:06:46 -07:00
|
|
|
EOLIAN static void
|
2016-06-17 01:26:08 -07:00
|
|
|
_efl_canvas_group_clipped_efl_canvas_group_group_member_add(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED, Evas_Object *member)
|
2008-09-06 19:10:17 -07:00
|
|
|
{
|
2016-08-15 06:44:41 -07:00
|
|
|
efl_canvas_group_member_add(efl_super(eo_obj, MY_CLASS), member);
|
2012-10-08 18:58:41 -07:00
|
|
|
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)
|
|
|
|
{
|
|
|
|
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
|
2008-10-24 19:49:19 -07:00
|
|
|
if (!cso->clipper)
|
|
|
|
return;
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_clip_unset(member);
|
2015-10-14 15:54:41 -07:00
|
|
|
if (!evas_object_clipees_has(cso->clipper))
|
2008-09-06 19:10:17 -07:00
|
|
|
evas_object_hide(cso->clipper);
|
|
|
|
}
|
|
|
|
|
2014-03-10 08:06:46 -07:00
|
|
|
EOLIAN static void
|
2016-06-17 01:26:08 -07:00
|
|
|
_efl_canvas_group_clipped_efl_canvas_group_group_member_del(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED, Evas_Object *member)
|
2012-10-08 18:58:41 -07:00
|
|
|
{
|
|
|
|
evas_object_smart_clipped_smart_member_del(eo_obj, member);
|
2016-08-15 06:44:41 -07:00
|
|
|
efl_canvas_group_member_del(efl_super(eo_obj, MY_CLASS), member);
|
2012-10-08 18:58:41 -07:00
|
|
|
}
|
|
|
|
|
2017-08-31 20:30:49 -07:00
|
|
|
EOLIAN static Eo *
|
|
|
|
_efl_canvas_group_clipped_efl_object_constructor(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED)
|
|
|
|
{
|
|
|
|
// Setting this flag before the parent constructor on purpose.
|
|
|
|
efl_canvas_group_unclipped_set(eo_obj, EINA_FALSE);
|
|
|
|
return efl_constructor(efl_super(eo_obj, MY_CLASS));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Legacy only */
|
2008-09-06 19:10:17 -07:00
|
|
|
EAPI void
|
|
|
|
evas_object_smart_clipped_smart_set(Evas_Smart_Class *sc)
|
|
|
|
{
|
|
|
|
if (!sc)
|
|
|
|
return;
|
|
|
|
|
|
|
|
sc->add = evas_object_smart_clipped_smart_add;
|
|
|
|
sc->del = evas_object_smart_clipped_smart_del;
|
|
|
|
sc->move = evas_object_smart_clipped_smart_move;
|
2016-10-10 02:59:42 -07:00
|
|
|
sc->show = evas_object_smart_clipped_smart_show;
|
|
|
|
sc->hide = evas_object_smart_clipped_smart_hide;
|
2008-09-06 19:10:17 -07:00
|
|
|
sc->color_set = evas_object_smart_clipped_smart_color_set;
|
|
|
|
sc->clip_set = evas_object_smart_clipped_smart_clip_set;
|
|
|
|
sc->clip_unset = evas_object_smart_clipped_smart_clip_unset;
|
2008-10-27 14:21:53 -07:00
|
|
|
sc->calculate = NULL;
|
2008-10-24 19:49:19 -07:00
|
|
|
sc->member_add = evas_object_smart_clipped_smart_member_add;
|
|
|
|
sc->member_del = evas_object_smart_clipped_smart_member_del;
|
2008-09-06 19:10:17 -07:00
|
|
|
}
|
|
|
|
|
2010-03-22 18:22:20 -07:00
|
|
|
EAPI const Evas_Smart_Class *
|
|
|
|
evas_object_smart_clipped_class_get(void)
|
|
|
|
{
|
|
|
|
static Evas_Smart_Class _sc = EVAS_SMART_CLASS_INIT_NAME_VERSION("EvasObjectSmartClipped");
|
|
|
|
static const Evas_Smart_Class *class = NULL;
|
|
|
|
|
|
|
|
if (class)
|
|
|
|
return class;
|
|
|
|
|
|
|
|
evas_object_smart_clipped_smart_set(&_sc);
|
|
|
|
class = &_sc;
|
|
|
|
return class;
|
|
|
|
}
|
2012-10-08 18:58:41 -07:00
|
|
|
|
2017-05-18 01:52:17 -07:00
|
|
|
/* Internal EO APIs and hidden overrides */
|
|
|
|
|
|
|
|
#define EFL_CANVAS_GROUP_CLIPPED_EXTRA_OPS \
|
|
|
|
EFL_CANVAS_GROUP_ADD_DEL_OPS(efl_canvas_group_clipped)
|
|
|
|
|
2016-06-17 01:26:08 -07:00
|
|
|
#include "canvas/efl_canvas_group_clipped.eo.c"
|
2014-03-11 04:51:35 -07:00
|
|
|
|