forked from enlightenment/efl
356 lines
7.9 KiB
C
356 lines
7.9 KiB
C
#include "Edje.h"
|
|
#include "edje_private.h"
|
|
|
|
static void _edje_smart_add(Evas_Object * obj);
|
|
static void _edje_smart_del(Evas_Object * obj);
|
|
static void _edje_smart_layer_set(Evas_Object * obj, int layer);
|
|
static void _edje_smart_raise(Evas_Object * obj);
|
|
static void _edje_smart_lower(Evas_Object * obj);
|
|
static void _edje_smart_stack_above(Evas_Object * obj, Evas_Object * above);
|
|
static void _edje_smart_stack_below(Evas_Object * obj, Evas_Object * below);
|
|
static void _edje_smart_move(Evas_Object * obj, double x, double y);
|
|
static void _edje_smart_resize(Evas_Object * obj, double w, double h);
|
|
static void _edje_smart_show(Evas_Object * obj);
|
|
static void _edje_smart_hide(Evas_Object * obj);
|
|
static void _edje_smart_color_set(Evas_Object * obj, int r, int g, int b, int a);
|
|
static void _edje_smart_clip_set(Evas_Object * obj, Evas_Object * clip);
|
|
static void _edje_smart_clip_unset(Evas_Object * obj);
|
|
|
|
static Evas_Smart *_edje_smart = NULL;
|
|
|
|
/* API Routines */
|
|
Evas_Object *
|
|
edje_object_add(Evas *evas)
|
|
{
|
|
if (!_edje_smart)
|
|
{
|
|
edje_init();
|
|
_edje_smart = evas_smart_new("edje",
|
|
_edje_smart_add,
|
|
_edje_smart_del,
|
|
_edje_smart_layer_set,
|
|
_edje_smart_raise,
|
|
_edje_smart_lower,
|
|
_edje_smart_stack_above,
|
|
_edje_smart_stack_below,
|
|
_edje_smart_move,
|
|
_edje_smart_resize,
|
|
_edje_smart_show,
|
|
_edje_smart_hide,
|
|
_edje_smart_color_set,
|
|
_edje_smart_clip_set,
|
|
_edje_smart_clip_unset,
|
|
NULL);
|
|
}
|
|
return evas_object_smart_add(evas, _edje_smart);
|
|
}
|
|
|
|
/* Private Routines */
|
|
static void
|
|
_edje_smart_add(Evas_Object * obj)
|
|
{
|
|
Edje *ed;
|
|
|
|
ed = _edje_add(obj);
|
|
if (!ed) return;
|
|
evas_object_smart_data_set(obj, ed);
|
|
ed->obj = obj;
|
|
evas_object_smart_member_add(ed->clipper, ed->obj);
|
|
}
|
|
|
|
static void
|
|
_edje_smart_del(Evas_Object * obj)
|
|
{
|
|
Edje *ed;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
_edje_clean_objects(ed);
|
|
_edje_unref(ed);
|
|
}
|
|
|
|
static void
|
|
_edje_smart_layer_set(Evas_Object * obj, int layer)
|
|
{
|
|
Edje *ed;
|
|
Evas_List *l;
|
|
char buf[256];
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
if (ed->layer == layer) return;
|
|
ed->layer = layer;
|
|
for (l = ed->parts; l; l = l->next)
|
|
{
|
|
Edje_Real_Part *ep;
|
|
|
|
ep = l->data;
|
|
if (ep->extra_objects)
|
|
{
|
|
Evas_List *el;
|
|
|
|
for (el = ep->extra_objects; el; el = el->next)
|
|
{
|
|
Evas_Object *o;
|
|
|
|
o = el->data;
|
|
evas_object_layer_set(o, ed->layer);
|
|
}
|
|
}
|
|
evas_object_layer_set(ep->object, ed->layer);
|
|
if (ep->swallowed_object)
|
|
evas_object_layer_set(ep->swallowed_object, ed->layer);
|
|
}
|
|
snprintf(buf, sizeof(buf), "layer,set,%i", layer);
|
|
_edje_emit(ed, buf, "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_raise(Evas_Object * obj)
|
|
{
|
|
Edje *ed;
|
|
Evas_List *l;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
for (l = ed->parts; l; l = l->next)
|
|
{
|
|
Edje_Real_Part *ep;
|
|
|
|
ep = l->data;
|
|
if (ep->extra_objects)
|
|
{
|
|
Evas_List *el;
|
|
|
|
for (el = ep->extra_objects; el; el = el->next)
|
|
{
|
|
Evas_Object *o;
|
|
|
|
o = el->data;
|
|
evas_object_raise(o);
|
|
}
|
|
}
|
|
evas_object_raise(ep->object);
|
|
if (ep->swallowed_object)
|
|
evas_object_raise(ep->swallowed_object);
|
|
}
|
|
_edje_emit(ed, "raise", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_lower(Evas_Object * obj)
|
|
{
|
|
Edje *ed;
|
|
Evas_List *l;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
for (l = evas_list_last(ed->parts); l; l = l->prev)
|
|
{
|
|
Edje_Real_Part *ep;
|
|
|
|
ep = l->data;
|
|
if (ep->swallowed_object)
|
|
evas_object_lower(ep->swallowed_object);
|
|
evas_object_lower(ep->object);
|
|
if (ep->extra_objects)
|
|
{
|
|
Evas_List *el;
|
|
|
|
for (el = ep->extra_objects; el; el = el->next)
|
|
{
|
|
Evas_Object *o;
|
|
|
|
o = el->data;
|
|
evas_object_lower(o);
|
|
}
|
|
}
|
|
}
|
|
_edje_emit(ed, "lower", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_stack_above(Evas_Object * obj, Evas_Object * above)
|
|
{
|
|
Edje *ed;
|
|
Evas_List *l;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
for (l = evas_list_last(ed->parts); l; l = l->prev)
|
|
{
|
|
Edje_Real_Part *ep;
|
|
|
|
ep = l->data;
|
|
if (ep->swallowed_object)
|
|
evas_object_stack_above(ep->swallowed_object, above);
|
|
evas_object_stack_above(ep->object, above);
|
|
if (ep->extra_objects)
|
|
{
|
|
Evas_List *el;
|
|
|
|
for (el = evas_list_last(ep->extra_objects); el; el = el->prev)
|
|
{
|
|
Evas_Object *o;
|
|
|
|
o = el->data;
|
|
evas_object_stack_above(o, above);
|
|
}
|
|
}
|
|
}
|
|
_edje_emit(ed, "stack_above", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_stack_below(Evas_Object * obj, Evas_Object * below)
|
|
{
|
|
Edje *ed;
|
|
Evas_List *l;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
for (l = ed->parts; l; l = l->next)
|
|
{
|
|
Edje_Real_Part *ep;
|
|
|
|
ep = l->data;
|
|
if (ep->extra_objects)
|
|
{
|
|
Evas_List *el;
|
|
|
|
for (el = ep->extra_objects; el; el = el->next)
|
|
{
|
|
Evas_Object *o;
|
|
|
|
o = el->data;
|
|
evas_object_stack_below(o, below);
|
|
}
|
|
}
|
|
evas_object_stack_below(ep->object, below);
|
|
if (ep->swallowed_object)
|
|
evas_object_stack_below(ep->swallowed_object, below);
|
|
}
|
|
_edje_emit(ed, "stack_below", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_move(Evas_Object * obj, double x, double y)
|
|
{
|
|
Edje *ed;
|
|
Evas_List *l;
|
|
double xx, yy;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
if ((ed->x == x) && (ed->y == y)) return;
|
|
ed->x = x;
|
|
ed->y = y;
|
|
evas_object_move(ed->clipper, ed->x, ed->y);
|
|
|
|
for (l = ed->parts; l; l = l->next)
|
|
{
|
|
Edje_Real_Part *ep;
|
|
double ox, oy;
|
|
|
|
ep = l->data;
|
|
evas_object_geometry_get(ep->object, &ox, &oy, NULL, NULL);
|
|
evas_object_move(ep->object, ed->x + ep->x + ep->offset.x, ed->y + ep->y +ep->offset.y);
|
|
if (ep->swallowed_object)
|
|
{
|
|
evas_object_geometry_get(ep->swallowed_object, &ox, &oy, NULL, NULL);
|
|
evas_object_move(ep->swallowed_object, ed->x + ep->x + ep->offset.x, ed->y + ep->y +ep->offset.y);
|
|
}
|
|
if (ep->extra_objects)
|
|
{
|
|
Evas_List *el;
|
|
|
|
for (el = ep->extra_objects; el; el = el->next)
|
|
{
|
|
Evas_Object *o;
|
|
double oox, ooy;
|
|
|
|
o = el->data;
|
|
evas_object_geometry_get(o, &oox, &ooy, NULL, NULL);
|
|
evas_object_move(o, ed->x + ep->x + ep->offset.x + (oox - ox), ed->y + ep->y + ep->offset.y + (ooy - oy));
|
|
}
|
|
}
|
|
}
|
|
_edje_emit(ed, "move", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_resize(Evas_Object * obj, double w, double h)
|
|
{
|
|
Edje *ed;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
if ((w == ed->w) && (h == ed->h)) return;
|
|
ed->w = w;
|
|
ed->h = h;
|
|
evas_object_resize(ed->clipper, ed->w, ed->h);
|
|
ed->dirty = 1;
|
|
_edje_recalc(ed);
|
|
_edje_emit(ed, "resize", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_show(Evas_Object * obj)
|
|
{
|
|
Edje *ed;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
if (evas_object_visible_get(obj)) return;
|
|
if ((ed->collection) && (ed->parts))
|
|
evas_object_show(ed->clipper);
|
|
_edje_emit(ed, "show", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_hide(Evas_Object * obj)
|
|
{
|
|
Edje *ed;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
if (!evas_object_visible_get(obj)) return;
|
|
evas_object_hide(ed->clipper);
|
|
_edje_emit(ed, "hide", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_color_set(Evas_Object * obj, int r, int g, int b, int a)
|
|
{
|
|
Edje *ed;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
evas_object_color_set(ed->clipper, r, g, b, a);
|
|
_edje_emit(ed, "color_set", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_clip_set(Evas_Object * obj, Evas_Object * clip)
|
|
{
|
|
Edje *ed;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
if (evas_object_clip_get(obj) == clip) return;
|
|
evas_object_clip_set(ed->clipper, clip);
|
|
_edje_emit(ed, "clip_set", "");
|
|
}
|
|
|
|
static void
|
|
_edje_smart_clip_unset(Evas_Object * obj)
|
|
{
|
|
Edje *ed;
|
|
|
|
ed = evas_object_smart_data_get(obj);
|
|
if (!ed) return;
|
|
if (!evas_object_clip_get(obj)) return;
|
|
evas_object_clip_unset(ed->clipper);
|
|
_edje_emit(ed, "clip_unset", "");
|
|
}
|