enlightenment/src/bin/efx/efx_util.c

138 lines
3.9 KiB
C

#include "e_efx_private.h"
static void
_obj_del(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
E_EFX *e;
e = evas_object_data_get(obj, "e_efx-data");
if (!e) return;
if (e->owner)
e->owner->followers = eina_list_remove(e->owner->followers, e);
e->owner = NULL;
e_efx_free(e);
}
EAPI void
e_efx_realize(Evas_Object *obj)
{
E_EFX *e;
Evas_Coord x, y, ox, oy, w, h;
Evas_Point p1, p2;
double zw, zh;
Evas_Map *map;
e = evas_object_data_get(obj, "e_efx-data");
if (!e) return;
if (!e->map_data.rotate_center) return;
evas_object_geometry_get(obj, &ox, &oy, &w, &h);
map = (Evas_Map*)evas_object_map_get(obj);
if (!map) return;
evas_map_point_coord_get(map, 0, &p1.x, &p1.y, NULL);
evas_map_point_coord_get(map, 2, &p2.x, &p2.y, NULL);
x = lround((double)(p1.x + p2.x) / 2.);
y = lround((double)(p1.y + p2.y) / 2.);
if (!eina_dbl_exact(e->map_data.zoom, 0))
zw = e->map_data.zoom * w, zh = e->map_data.zoom * h;
else
zw = w, zh = h;
x = lround(x - (zw / 2.));
y = lround(y - (zh / 2.));
evas_object_move(obj, x, y);
evas_object_resize(obj, lround(zw), lround(zh));
e->map_data.zoom = 0;
free(e->map_data.rotate_center);
e->map_data.rotate_center = NULL;
map = e_efx_map_new(obj);
e_efx_maps_apply(e, obj, map, E_EFX_MAPS_APPLY_ALL);
e_efx_map_set(obj, map);
INF("realize: %p - (%d,%d)@%dx%d -> (%d,%d)@%dx%d", obj, ox, oy, w, h, x, y, (int)zw, (int)zh);
}
EAPI Eina_Bool
e_efx_follow(Evas_Object *obj, Evas_Object *follower)
{
E_EFX *e, *ef;
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(follower, EINA_FALSE);
e = evas_object_data_get(obj, "e_efx-data");
if (!e) e = e_efx_new(obj);
EINA_SAFETY_ON_NULL_RETURN_VAL(e, EINA_FALSE);
while (e->owner) e = e->owner;
ef = evas_object_data_get(follower, "e_efx-data");
if (ef)
{
if (ef->owner)
{
if (ef->owner == e) return EINA_TRUE;
ef->owner->followers = eina_list_remove(ef->owner->followers, ef);
}
}
else
ef = e_efx_new(follower);
EINA_SAFETY_ON_NULL_RETURN_VAL(ef, EINA_FALSE);
if ((!ef->zoom_data) && (!ef->rotate_data) && (!ef->spin_data) && (!ef->move_data) && (!ef->bumpmap_data) && (!ef->pan_data) && (!ef->fade_data))
evas_object_event_callback_priority_add(ef->obj, EVAS_CALLBACK_FREE, EVAS_CALLBACK_PRIORITY_BEFORE, (Evas_Object_Event_Cb)_obj_del, ef);
ef->owner = e;
e->followers = eina_list_append(e->followers, ef);
INF("follow: (owner %p: %u) || (follower %p)", obj, eina_list_count(e->followers), follower);
return EINA_TRUE;
(void)e_efx_speed_str;
}
EAPI void
e_efx_unfollow(Evas_Object *obj)
{
E_EFX *e;
EINA_SAFETY_ON_NULL_RETURN(obj);
e = evas_object_data_get(obj, "e_efx-data");
if (!e) return;
if (!e->owner) return;
INF("unfollow: (owner %p) || (follower %p)", e->owner->obj, obj);
e->owner->followers = eina_list_remove(e->owner->followers, e);
evas_object_event_callback_del_full(obj, EVAS_CALLBACK_FREE, (Evas_Object_Event_Cb)_obj_del, e);
e_efx_free(e->owner);
e->owner = NULL;
e_efx_free(e);
}
EAPI Eina_List *
e_efx_followers_get(Evas_Object *obj)
{
E_EFX *e, *f;
Eina_List *l, *ret = NULL;
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
e = evas_object_data_get(obj, "e_efx-data");
if (!e) return NULL;
EINA_LIST_FOREACH(e->followers, l, f)
ret = eina_list_append(ret, f->obj);
return ret;
}
EAPI Evas_Object *
e_efx_leader_get(Evas_Object *obj)
{
E_EFX *e;
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
e = evas_object_data_get(obj, "e_efx-data");
if (!e) return NULL;
return e->owner ? e->owner->obj : NULL;
}
EAPI void
e_efx_reclip(Evas_Object *obj)
{
E_EFX *e;
EINA_SAFETY_ON_NULL_RETURN(obj);
e = evas_object_data_get(obj, "e_efx-data");
if (!e) return;
if (e->fade_data) e_efx_fade_reclip(e->fade_data);
}