efl/legacy/edje/src/lib/edje_smart.c

349 lines
9.0 KiB
C

#include "edje_private.h"
static void _edje_smart_add(Evas_Object * obj);
static void _edje_smart_del(Evas_Object * obj);
static void _edje_smart_move(Evas_Object * obj, Evas_Coord x, Evas_Coord y);
static void _edje_smart_resize(Evas_Object * obj, Evas_Coord w, Evas_Coord h);
static void _edje_smart_show(Evas_Object * obj);
static void _edje_smart_hide(Evas_Object * obj);
static void _edje_smart_calculate(Evas_Object * obj);
static Eina_Bool _edje_smart_file_set(Evas_Object *obj, const char *file, const char *group, Eina_Array *nested);
static Edje_Smart_Api _edje_smart_class = EDJE_SMART_API_INIT_NAME_VERSION("edje");
static Evas_Smart_Class _edje_smart_parent;
static Evas_Smart *_edje_smart = NULL;
Eina_List *_edje_edjes = NULL;
/************************** API Routines **************************/
EAPI Evas_Object *
edje_object_add(Evas *evas)
{
Evas_Object *e;
_edje_lib_ref();
if (!_edje_smart)
{
memset(&_edje_smart_parent, 0, sizeof(_edje_smart_parent));
_edje_object_smart_set(&_edje_smart_class);
_edje_smart =
evas_smart_class_new((Evas_Smart_Class *)&_edje_smart_class);
}
e = evas_object_smart_add(evas, _edje_smart);
return e;
}
void
_edje_object_smart_set(Edje_Smart_Api *sc)
{
if (!sc)
return;
evas_object_smart_clipped_smart_set(&sc->base);
_edje_smart_parent.add = sc->base.add; /* Save parent class */
sc->base.add = _edje_smart_add;
_edje_smart_parent.del = sc->base.del; /* Save parent class */
sc->base.del = _edje_smart_del;
/* we'll handle move thank you */
sc->base.move = _edje_smart_move;
sc->base.resize = _edje_smart_resize;
_edje_smart_parent.show = sc->base.show; /* Save parent class */
sc->base.show = _edje_smart_show;
_edje_smart_parent.hide = sc->base.hide; /* Save parent class */
sc->base.hide = _edje_smart_hide;
sc->base.calculate = _edje_smart_calculate;
//sc->base.member_add = NULL;
//sc->base.member_del = NULL;
sc->file_set = _edje_smart_file_set;
}
const Edje_Smart_Api *
_edje_object_smart_class_get(void)
{
static const Edje_Smart_Api *class = NULL;
if (class)
return class;
_edje_object_smart_set(&_edje_smart_class);
class = &_edje_smart_class;
return class;
}
static void
_edje_color_class_free(void *data)
{
Edje_Color_Class *cc = data;
if (cc->name) eina_stringshare_del(cc->name);
free(cc);
}
/* Private Routines */
static void
_edje_smart_add(Evas_Object *obj)
{
Edje *ed;
Evas *tev = evas_object_evas_get(obj);
evas_event_freeze(tev);
ed = evas_object_smart_data_get(obj);
if (!ed)
{
const Evas_Smart *smart;
const Evas_Smart_Class *sc;
ed = calloc(1, sizeof(Edje));
if (!ed) goto end_smart_add;
smart = evas_object_smart_smart_get(obj);
sc = evas_smart_class_get(smart);
ed->api = (const Edje_Smart_Api *)sc;
evas_object_smart_data_set(obj, ed);
}
ed->base.evas = evas_object_evas_get(obj);
ed->base.clipper = evas_object_rectangle_add(ed->base.evas);
evas_object_static_clip_set(ed->base.clipper, 1);
evas_object_smart_member_add(ed->base.clipper, obj);
evas_object_color_set(ed->base.clipper, 255, 255, 255, 255);
evas_object_move(ed->base.clipper, -10000, -10000);
evas_object_resize(ed->base.clipper, 20000, 20000);
evas_object_pass_events_set(ed->base.clipper, 1);
ed->is_rtl = EINA_FALSE;
ed->have_objects = 1;
ed->references = 1;
ed->user_defined = NULL;
ed->color_classes = eina_hash_string_small_new(_edje_color_class_free);
evas_object_geometry_get(obj, &(ed->x), &(ed->y), &(ed->w), &(ed->h));
ed->obj = obj;
_edje_edjes = eina_list_append(_edje_edjes, obj);
/*
{
Eina_List *l;
const void *data;
printf("--- EDJE DUMP [%i]\n", eina_list_count(_edje_edjes));
EINA_LIST_FOREACH(_edge_edges, l, data)
{
ed = _edje_fetch(data);
printf("EDJE: %80s | %80s\n", ed->path, ed->part);
}
printf("--- EDJE DUMP [%i]\n", eina_list_count(_edje_edjes));
}
*/
end_smart_add:
evas_event_thaw(tev);
evas_event_thaw_eval(tev);
}
static void
_edje_smart_del(Evas_Object * obj)
{
Edje *ed;
ed = evas_object_smart_data_get(obj);
if (!ed) return;
_edje_block_violate(ed);
ed->delete_me = 1;
_edje_edjes = eina_list_remove(_edje_edjes, obj);
evas_object_smart_data_set(obj, NULL);
if (_edje_script_only(ed)) _edje_script_only_shutdown(ed);
if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed);
if (ed->persp) edje_object_perspective_set(obj, NULL);
_edje_file_del(ed);
_edje_clean_objects(ed);
_edje_unref(ed);
_edje_lib_unref();
}
static void
_edje_smart_move(Evas_Object * obj, Evas_Coord x, Evas_Coord y)
{
Edje *ed;
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);
if (_edje_script_only(ed))
{
_edje_script_only_move(ed);
return;
}
if (_edje_lua_script_only(ed))
{
_edje_lua_script_only_move(ed);
return;
}
if (ed->have_mapped_part)
{
ed->dirty = 1;
_edje_recalc_do(ed);
}
else
{
unsigned int i;
for (i = 0; i < ed->table_parts_size; i++)
{
Edje_Real_Part *ep;
Evas_Coord ox, oy;
ep = ed->table_parts[i];
evas_object_geometry_get(ep->object, &ox, &oy, NULL, NULL);
evas_object_move(ep->object, ed->x + ep->x + ep->text.offset.x, ed->y + ep->y + ep->text.offset.y);
if (ep->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
_edje_entry_real_part_configure(ep);
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->text.offset.x, ed->y + ep->y + ep->text.offset.y);
}
}
}
// _edje_emit(ed, "move", NULL);
}
static void
_edje_limit_emit(Edje *ed, const char *limit_name, Eina_Bool over)
{
char *buffer;
unsigned int length;
if (!limit_name) return ;
length = strlen(limit_name) + 13;
buffer = alloca(length);
snprintf(buffer, length, "limit,%s,%s", limit_name, over ? "over" : "below");
_edje_emit(ed, buffer, NULL);
}
static void
_edje_limit_get(Edje *ed, Edje_Limit **limits, unsigned int length, Evas_Coord size_current, Evas_Coord size_next)
{
unsigned int i;
if (size_next == size_current) return ;
for (i = 0; i < length; ++i)
{
if ((size_current <= limits[i]->value) && (limits[i]->value < size_next))
{
_edje_limit_emit(ed, limits[i]->name, EINA_TRUE);
}
else if ((size_next <= limits[i]->value) && (limits[i]->value < size_current))
{
_edje_limit_emit(ed, limits[i]->name, EINA_FALSE);
}
}
}
static void
_edje_smart_resize(Evas_Object * obj, Evas_Coord w, Evas_Coord h)
{
Edje *ed;
ed = evas_object_smart_data_get(obj);
if (!ed) return;
if ((w == ed->w) && (h == ed->h)) return;
if (ed->collection)
{
_edje_limit_get(ed, ed->collection->limits.horizontal, ed->collection->limits.horizontal_count, ed->w, w);
_edje_limit_get(ed, ed->collection->limits.vertical, ed->collection->limits.vertical_count, ed->h, h);
}
ed->w = w;
ed->h = h;
#ifdef EDJE_CALC_CACHE
ed->all_part_change = 1;
#endif
if (_edje_script_only(ed))
{
_edje_script_only_resize(ed);
return;
}
if (_edje_lua_script_only(ed))
{
_edje_lua_script_only_resize(ed);
return;
}
// evas_object_resize(ed->clipper, ed->w, ed->h);
ed->dirty = 1;
_edje_recalc_do(ed);
_edje_emit(ed, "resize", NULL);
}
static void
_edje_smart_show(Evas_Object * obj)
{
Edje *ed;
_edje_smart_parent.show(obj);
ed = evas_object_smart_data_get(obj);
if (!ed) return;
if (evas_object_visible_get(obj)) return;
if (_edje_script_only(ed))
{
_edje_script_only_show(ed);
return;
}
if (_edje_lua_script_only(ed))
{
_edje_lua_script_only_show(ed);
return;
}
_edje_emit(ed, "show", NULL);
}
static void
_edje_smart_hide(Evas_Object * obj)
{
Edje *ed;
_edje_smart_parent.hide(obj);
ed = evas_object_smart_data_get(obj);
if (!ed) return;
if (!evas_object_visible_get(obj)) return;
if (_edje_script_only(ed))
{
_edje_script_only_hide(ed);
return;
}
if (_edje_lua_script_only(ed))
{
_edje_lua_script_only_hide(ed);
return;
}
_edje_emit(ed, "hide", NULL);
}
static void
_edje_smart_calculate(Evas_Object *obj)
{
Edje *ed;
ed = evas_object_smart_data_get(obj);
if (!ed) return;
_edje_recalc_do(ed);
}
static Eina_Bool
_edje_smart_file_set(Evas_Object *obj, const char *file, const char *group, Eina_Array *nested)
{
return _edje_object_file_set_internal(obj, file, group, NULL, NULL, nested);
}