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

1216 lines
26 KiB
C
Raw Normal View History

#include "Edje.h"
#include "edje_private.h"
Evas_Hash *_edje_color_class_hash = NULL;
Evas_Hash *_edje_color_class_member_hash = NULL;
Evas_Hash *_edje_text_class_hash = NULL;
Evas_Hash *_edje_text_class_member_hash = NULL;
void
edje_freeze(void)
{
Evas_List *l;
for (l = _edje_edjes; l; l = l->next)
edje_object_freeze((Evas_Object *)(l->data));
}
void
edje_thaw(void)
{
Evas_List *l;
for (l = _edje_edjes; l; l = l->next)
edje_object_thaw((Evas_Object *)(l->data));
}
const char *
edje_object_data_get(Evas_Object *obj, const char *key)
{
Edje *ed;
Evas_List *l;
ed = _edje_fetch(obj);
if ((!ed) || (!key))
return NULL;
if (!ed->collection) return NULL;
for (l = ed->collection->data; l; l = l->next)
{
Edje_Data *di;
di = l->data;
if (!strcmp(di->key, key)) return (const char *)di->value;
}
return NULL;
}
int
edje_object_freeze(Evas_Object *obj)
{
Edje *ed;
ed = _edje_fetch(obj);
if (!ed) return 0;
return _edje_freeze(ed);
}
int
edje_object_thaw(Evas_Object *obj)
{
Edje *ed;
ed = _edje_fetch(obj);
if (!ed) return 0;
return _edje_thaw(ed);
}
void
edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
{
Evas_List *members;
Edje_Color_Class *cc;
if (!color_class) return;
cc = evas_hash_find(_edje_color_class_hash, color_class);
if (!cc)
{
cc = malloc(sizeof(Edje_Color_Class));
if (!cc) return;
cc->name = strdup(color_class);
if (!cc->name)
{
free(cc);
return;
}
_edje_color_class_hash = evas_hash_add(_edje_color_class_hash, color_class, cc);
if (evas_hash_alloc_error())
{
free(cc->name);
free(cc);
return;
}
}
if (r < 0) r = 0;
if (r > 255) r = 255;
if (g < 0) g = 0;
if (g > 255) g = 255;
if (b < 0) b = 0;
if (b > 255) b = 255;
if (a < 0) a = 0;
if (a > 255) a = 255;
if ((cc->r == r) && (cc->g == g) &&
(cc->b == b) && (cc->a == a) &&
(cc->r2 == r2) && (cc->g2 == g2) &&
(cc->b2 == b2) && (cc->a2 == a2) &&
(cc->r3 == r3) && (cc->g3 == g3) &&
(cc->b3 == b3) && (cc->a3 == a3))
return;
cc->r = r;
cc->g = g;
cc->b = b;
cc->a = a;
cc->r2 = r2;
cc->g2 = g2;
cc->b2 = b2;
cc->a2 = a2;
cc->r3 = r3;
cc->g3 = g3;
cc->b3 = b3;
cc->a3 = a3;
members = evas_hash_find(_edje_color_class_member_hash, color_class);
while (members)
{
Edje *ed;
ed = members->data;
ed->dirty = 1;
_edje_recalc(ed);
members = members->next;
}
}
void
edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
{
Edje *ed;
Evas_List *l;
Edje_Color_Class *cc;
ed = _edje_fetch(obj);
if ((!ed) || (!color_class)) return;
if (r < 0) r = 0;
if (r > 255) r = 255;
if (g < 0) g = 0;
if (g > 255) g = 255;
if (b < 0) b = 0;
if (b > 255) b = 255;
if (a < 0) a = 0;
if (a > 255) a = 255;
for (l = ed->color_classes; l; l = l->next)
{
cc = l->data;
if (!strcmp(cc->name, color_class))
{
if ((cc->r == r) && (cc->g == g) &&
(cc->b == b) && (cc->a == a) &&
(cc->r2 == r2) && (cc->g2 == g2) &&
(cc->b2 == b2) && (cc->a2 == a2) &&
(cc->r3 == r3) && (cc->g3 == g3) &&
(cc->b3 == b3) && (cc->a3 == a3))
return;
cc->r = r;
cc->g = g;
cc->b = b;
cc->a = a;
cc->r2 = r2;
cc->g2 = g2;
cc->b2 = b2;
cc->a2 = a2;
cc->r3 = r3;
cc->g3 = g3;
cc->b3 = b3;
cc->a3 = a3;
ed->dirty = 1;
_edje_recalc(ed);
return;
}
}
cc = malloc(sizeof(Edje_Color_Class));
if (!cc) return;
cc->name = strdup(color_class);
if (!cc->name)
{
free(cc);
return;
}
cc->r = r;
cc->g = g;
cc->b = b;
cc->a = a;
cc->r2 = r2;
cc->g2 = g2;
cc->b2 = b2;
cc->a2 = a2;
cc->r3 = r3;
cc->g3 = g3;
cc->b3 = b3;
cc->a3 = a3;
ed->color_classes = evas_list_append(ed->color_classes, cc);
ed->dirty = 1;
_edje_recalc(ed);
}
void
edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size)
{
Evas_List *members;
Edje_Text_Class *tc;
if (!text_class) return;
if (size < 0) size = 0;
if (!font) font = "";
tc = evas_hash_find(_edje_text_class_hash, text_class);
if (!tc)
{
tc = calloc(1, sizeof(Edje_Text_Class));
if (!tc) return;
tc->name = strdup(text_class);
if (!tc->name)
{
free(tc);
return;
}
_edje_text_class_hash = evas_hash_add(_edje_text_class_hash, text_class, tc);
if (evas_hash_alloc_error())
{
free(tc->name);
free(tc);
return;
}
tc->font = strdup(font);
tc->size = size;
return;
}
if ((tc->size == size) && (!strcmp(tc->font, font)))
return;
free(tc->font);
tc->font = strdup(font);
if (!tc->font)
{
_edje_text_class_hash = evas_hash_del(_edje_text_class_hash, text_class, tc);
free(tc);
return;
}
tc->size = size;
members = evas_hash_find(_edje_text_class_member_hash, text_class);
while (members)
{
Edje *ed;
ed = members->data;
ed->dirty = 1;
_edje_recalc(ed);
members = members->next;
}
}
void
edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
{
Edje *ed;
Evas_List *l;
Edje_Text_Class *tc;
ed = _edje_fetch(obj);
if ((!ed) || (!text_class)) return;
if (size < 0.0) size = 0.0;
for (l = ed->text_classes; l; l = l->next)
{
tc = l->data;
if (!strcmp(tc->name, text_class))
{
if ((tc->font) && (font) &&
(!strcmp(tc->font, font)) &&
(tc->size == size))
return;
if ((!tc->font) && (!font) &&
(tc->size == size))
return;
if (tc->font) free(tc->font);
if (font) tc->font = strdup(font);
else tc->font = NULL;
tc->size = size;
ed->dirty = 1;
_edje_recalc(ed);
return;
}
}
tc = malloc(sizeof(Edje_Text_Class));
if (!tc) return;
tc->name = strdup(text_class);
if (!tc->name)
{
free(tc);
return;
}
if (font) tc->font = strdup(font);
else tc->font = NULL;
tc->size = size;
ed->text_classes = evas_list_append(ed->text_classes, tc);
ed->dirty = 1;
_edje_recalc(ed);
}
int
edje_object_part_exists(Evas_Object *obj, const char *part)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return 0;
rp = _edje_real_part_get(ed, (char *)part);
if (!rp) return 0;
return 1;
}
void
edje_object_part_geometry_get(Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h )
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
if (x) *x = 0;
if (y) *y = 0;
if (w) *w = 0;
if (h) *h = 0;
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
if (x) *x = 0;
if (y) *y = 0;
if (w) *w = 0;
if (h) *h = 0;
return;
}
if (x) *x = rp->x;
if (y) *y = rp->y;
if (w) *w = rp->w;
if (h) *h = rp->h;
}
void
edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return;
rp = _edje_real_part_get(ed, (char *)part);
if (!rp) return;
if (rp->part->type != EDJE_PART_TYPE_TEXT) return;
if ((!rp->text.text) && (!text))
return;
if ((rp->text.text) && (text) &&
(!strcmp(rp->text.text, text)))
return;
if (rp->text.text) free(rp->text.text);
rp->text.text = strdup(text);
ed->dirty = 1;
_edje_recalc(ed);
}
const char *
edje_object_part_text_get(Evas_Object *obj, const char *part)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return NULL;
rp = _edje_real_part_get(ed, (char *)part);
if (!rp) return NULL;
if (rp->part->type == EDJE_PART_TYPE_TEXT)
return evas_object_text_text_get(rp->object);
return NULL;
}
void
edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_swallow)
{
Edje *ed;
Edje_Real_Part *rp;
char *type;
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return;
rp = _edje_real_part_get(ed, (char *)part);
if (!rp) return;
if (rp->swallowed_object)
{
2003-07-29 19:58:22 -07:00
evas_object_smart_member_del(rp->swallowed_object);
evas_object_event_callback_del(rp->swallowed_object,
EVAS_CALLBACK_FREE,
_edje_object_part_swallow_free_cb);
evas_object_clip_unset(rp->swallowed_object);
rp->swallowed_object = NULL;
}
if (!obj_swallow) return;
rp->swallowed_object = obj_swallow;
2003-07-29 19:58:22 -07:00
evas_object_smart_member_add(rp->swallowed_object, ed->obj);
if (rp->clip_to) evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
else evas_object_clip_set(rp->swallowed_object, ed->clipper);
if (evas_object_layer_get(rp->swallowed_object) != ed->layer)
evas_object_layer_set(rp->swallowed_object, ed->layer);
evas_object_stack_above(rp->swallowed_object, rp->object);
evas_object_event_callback_add(rp->swallowed_object,
EVAS_CALLBACK_FREE,
_edje_object_part_swallow_free_cb,
obj);
type = (char *)evas_object_type_get(obj_swallow);
rp->swallow_params.min.w = 0;
rp->swallow_params.min.w = 0;
rp->swallow_params.max.w = -1;
rp->swallow_params.max.h = -1;
if ((type) && (!strcmp(type, "edje")))
{
Evas_Coord w, h;
edje_object_size_min_get(obj_swallow, &w, &h);
rp->swallow_params.min.w = w;
rp->swallow_params.min.h = h;
edje_object_size_max_get(obj_swallow, &w, &h);
rp->swallow_params.max.w = w;
rp->swallow_params.max.h = h;
}
else if ((type) && ((!strcmp(type, "text")) ||
(!strcmp(type, "polygon")) ||
(!strcmp(type, "line"))))
{
Evas_Coord w, h;
evas_object_geometry_get(obj_swallow, NULL, NULL, &w, &h);
rp->swallow_params.min.w = w;
rp->swallow_params.min.h = h;
rp->swallow_params.max.w = w;
rp->swallow_params.max.h = h;
}
{
int w1, h1, w2, h2;
w1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minw");
h1 = (int)evas_object_data_get(obj_swallow, "\377 edje.minh");
w2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxw");
h2 = (int)evas_object_data_get(obj_swallow, "\377 edje.maxh");
rp->swallow_params.min.w = w1;
rp->swallow_params.min.h = h1;
if (w2 > 0) rp->swallow_params.max.w = w2;
if (h2 > 0) rp->swallow_params.max.h = h2;
}
ed->dirty = 1;
_edje_recalc(ed);
}
void
edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh)
{
int mw, mh;
mw = minw;
mh = minh;
if (mw < 0) mw = 0;
if (mh < 0) mh = 0;
if (mw > 0)
evas_object_data_set(obj, "\377 edje.minw", (void *)mw);
else
evas_object_data_del(obj, "\377 edje.minw");
if (mh > 0)
evas_object_data_set(obj, "\377 edje.minh", (void *)mh);
else
2003-12-27 02:51:02 -08:00
evas_object_data_del(obj, "\377 edje.minh");
}
void
edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh)
{
int mw, mh;
mw = maxw;
mh = maxh;
if (mw >= 0)
evas_object_data_set(obj, "\377 edje.maxw", (void *)mw);
else
evas_object_data_del(obj, "\377 edje.maxw");
if (mh >= 0)
evas_object_data_set(obj, "\377 edje.maxh", (void *)mh);
else
evas_object_data_del(obj, "\377 edje.maxh");
}
void
edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
{
Edje *ed;
Evas_List *l;
ed = _edje_fetch(obj);
if ((!ed) || (!obj_swallow)) return;
for (l = ed->parts; l; l = l->next)
{
Edje_Real_Part *rp;
rp = l->data;
if (rp->swallowed_object == obj_swallow)
{
2003-07-29 19:58:22 -07:00
evas_object_smart_member_del(rp->swallowed_object);
evas_object_clip_unset(rp->swallowed_object);
rp->swallowed_object = NULL;
rp->swallow_params.min.w = 0;
rp->swallow_params.min.h = 0;
rp->swallow_params.max.w = 0;
rp->swallow_params.max.h = 0;
ed->dirty = 1;
_edje_recalc(ed);
return;
}
}
}
Evas_Object *
edje_object_part_swallow_get(Evas_Object *obj, const char *part)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return NULL;
rp = _edje_real_part_get(ed, (char *)part);
if (!rp) return NULL;
return rp->swallowed_object;
}
void
edje_object_size_min_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
{
Edje *ed;
ed = _edje_fetch(obj);
if ((!ed) || (!ed->collection))
{
if (minw) *minw = 0;
if (minh) *minh = 0;
return;
}
if (minw) *minw = ed->collection->prop.min.w;
if (minh) *minh = ed->collection->prop.min.h;
}
void
edje_object_size_max_get(Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh)
{
Edje *ed;
ed = _edje_fetch(obj);
if ((!ed) || (!ed->collection))
{
if (maxw) *maxw = 0;
if (maxh) *maxh = 0;
return;
}
if (ed->collection->prop.max.w == 0)
{
if (maxw) *maxw = 1e+37;
}
else
{
if (maxw) *maxw = ed->collection->prop.max.w;
}
if (ed->collection->prop.max.h == 0)
{
if (maxh) *maxh = 1e+37;
}
else
{
if (maxh) *maxh = ed->collection->prop.max.h;
}
}
void
edje_object_size_min_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
{
Edje *ed;
Evas_Coord pw, ph;
int maxw, maxh;
int ok;
ed = _edje_fetch(obj);
if ((!ed) || (!ed->collection))
{
if (minw) *minw = 0;
if (minh) *minh = 0;
return;
}
ed->calc_only = 1;
pw = ed->w;
ph = ed->h;
ed->w = 0;
ed->h = 0;
maxw = 0;
maxh = 0;
ok = 1;
while (ok)
{
Evas_List *l;
ok = 0;
ed->dirty = 1;
_edje_recalc(ed);
for (l = ed->parts; l; l = l->next)
{
Edje_Real_Part *ep;
int w, h;
ep = l->data;
w = ep->w - ep->req.w;
h = ep->h - ep->req.h;
if (w > maxw)
{
maxw = w;
ok = 1;
}
if (h > maxh)
{
maxh = h;
ok = 1;
}
}
if (ok)
{
ed->w += maxw;
ed->h += maxh;
}
}
ed->min.w = ed->w;
ed->min.h = ed->h;
if (minw) *minw = ed->min.w;
if (minh) *minh = ed->min.h;
ed->w = pw;
ed->h = ph;
ed->dirty = 1;
_edje_recalc(ed);
ed->calc_only = 0;
}
const char *
edje_object_part_state_get(Evas_Object *obj, const char *part, double *val_ret)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
if (val_ret) *val_ret = 0;
return "";
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
if (val_ret) *val_ret = 0;
return "";
}
if (!rp->chosen_description)
{
if (val_ret) *val_ret = rp->chosen_description->state.value;
if (rp->chosen_description->state.name)
return rp->chosen_description->state.name;
return "default";
}
else
{
if (rp->param1.description)
{
if (val_ret) *val_ret = rp->param1.description->state.value;
if (rp->param1.description->state.name)
return rp->param1.description->state.name;
return "default";
}
}
if (val_ret) *val_ret = 0;
return "";
}
int
edje_object_part_drag_dir_get(Evas_Object *obj, const char *part)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
return EDJE_DRAG_DIR_NONE;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
return EDJE_DRAG_DIR_NONE;
}
if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
else if (rp->part->dragable.x) return EDJE_DRAG_DIR_X;
else if (rp->part->dragable.y) return EDJE_DRAG_DIR_Y;
return EDJE_DRAG_DIR_NONE;
}
void
edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, double dy)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
return;
}
if (rp->drag.down.count > 0) return;
2003-11-04 16:08:57 -08:00
if(rp->part->dragable.confine_id != -1)
{
if (dx < 0.0) dx = 0.0;
else if (dx > 1.0) dx = 1.0;
if (dy < 0.0) dy = 0.0;
else if (dy > 1.0) dy = 1.0;
}
if (rp->part->dragable.x < 0) dx = 1.0 - dx;
if (rp->part->dragable.y < 0) dy = 1.0 - dy;
if ((rp->drag.val.x == dx) && (rp->drag.val.y == dy)) return;
rp->drag.val.x = dx;
rp->drag.val.y = dy;
_edje_dragable_pos_set(ed, rp, dx, dy);
_edje_emit(ed, "drag,set", rp->part->name);
}
void
edje_object_part_drag_value_get(Evas_Object *obj, const char *part, double *dx, double *dy)
{
Edje *ed;
Edje_Real_Part *rp;
double ddx, ddy;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
if (dx) *dx = 0;
if (dy) *dy = 0;
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
if (dx) *dx = 0;
if (dy) *dy = 0;
return;
}
ddx = rp->drag.val.x;
ddy = rp->drag.val.y;
if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
if (dx) *dx = ddx;
if (dy) *dy = ddy;
}
void
edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, double dh)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
return;
}
if (dw < 0.0) dw = 0.0;
else if (dw > 1.0) dw = 1.0;
if (dh < 0.0) dh = 0.0;
else if (dh > 1.0) dh = 1.0;
if ((rp->drag.size.x == dw) && (rp->drag.size.y == dh)) return;
rp->drag.size.x = dw;
rp->drag.size.y = dh;
ed->dirty = 1;
_edje_recalc(ed);
}
void
edje_object_part_drag_size_get(Evas_Object *obj, const char *part, double *dw, double *dh)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
if (dw) *dw = 0;
if (dh) *dh = 0;
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
if (dw) *dw = 0;
if (dh) *dh = 0;
return;
}
if (dw) *dw = rp->drag.size.x;
if (dh) *dh = rp->drag.size.y;
}
void
edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, double dy)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
return;
}
if (rp->drag.down.count > 0) return;
if (dx < 0.0) dx = 0.0;
else if (dx > 1.0) dx = 1.0;
if (dy < 0.0) dy = 0.0;
else if (dy > 1.0) dy = 1.0;
rp->drag.step.x = dx;
rp->drag.step.y = dy;
}
void
edje_object_part_drag_step_get(Evas_Object *obj, const char *part, double *dx, double *dy)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
if (dx) *dx = 0;
if (dy) *dy = 0;
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
if (dx) *dx = 0;
if (dy) *dy = 0;
return;
}
if (dx) *dx = rp->drag.step.x;
if (dy) *dy = rp->drag.step.y;
}
void
edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, double dy)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
return;
}
if (rp->drag.down.count > 0) return;
if (dx < 0.0) dx = 0.0;
else if (dx > 1.0) dx = 1.0;
if (dy < 0.0) dy = 0.0;
else if (dy > 1.0) dy = 1.0;
rp->drag.page.x = dx;
rp->drag.page.y = dy;
}
void
edje_object_part_drag_page_get(Evas_Object *obj, const char *part, double *dx, double *dy)
{
Edje *ed;
Edje_Real_Part *rp;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
if (dx) *dx = 0;
if (dy) *dy = 0;
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
if (dx) *dx = 0;
if (dy) *dy = 0;
return;
}
if (dx) *dx = rp->drag.page.x;
if (dy) *dy = rp->drag.page.y;
}
void
edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double dy)
{
Edje *ed;
Edje_Real_Part *rp;
double px, py;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
return;
}
if (rp->drag.down.count > 0) return;
px = rp->drag.val.x;
py = rp->drag.val.y;
rp->drag.val.x += dx * rp->drag.step.x * rp->part->dragable.x;
rp->drag.val.y += dy * rp->drag.step.y * rp->part->dragable.y;
if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0;
else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0;
if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0;
if ((px == rp->drag.val.x) && (py == rp->drag.val.y)) return;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
_edje_emit(ed, "drag,step", rp->part->name);
}
void
edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double dy)
{
Edje *ed;
Edje_Real_Part *rp;
double px, py;
ed = _edje_fetch(obj);
if ((!ed) || (!part))
{
return;
}
rp = _edje_real_part_get(ed, (char *)part);
if (!rp)
{
return;
}
if (rp->drag.down.count > 0) return;
px = rp->drag.val.x;
py = rp->drag.val.y;
rp->drag.val.x += dx * rp->drag.page.x * rp->part->dragable.x;
rp->drag.val.y += dy * rp->drag.page.y * rp->part->dragable.y;
if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0;
else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0;
if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0;
if ((px == rp->drag.val.x) && (py == rp->drag.val.y)) return;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
_edje_emit(ed, "drag,page", rp->part->name);
}
Edje_Real_Part *
_edje_real_part_get(Edje *ed, char *part)
{
Evas_List *l;
for (l = ed->parts; l; l = l->next)
{
Edje_Real_Part *rp;
rp = l->data;
if (!strcmp(rp->part->name, part)) return rp;
}
return NULL;
}
Edje_Color_Class *
_edje_color_class_find(Edje *ed, char *color_class)
{
Evas_List *l;
if ((!ed) || (!color_class)) return NULL;
for (l = ed->color_classes; l; l = l->next)
{
Edje_Color_Class *cc;
cc = l->data;
if (!strcmp(color_class, cc->name)) return cc;
}
return evas_hash_find(_edje_color_class_hash, color_class);
}
void
_edje_color_class_member_add(Edje *ed, char *color_class)
{
Evas_List *members;
if ((!ed) || (!color_class)) return;
members = evas_hash_find(_edje_color_class_member_hash, color_class);
if (members) _edje_color_class_member_hash = evas_hash_del(_edje_color_class_member_hash, color_class, members);
members = evas_list_prepend(members, ed);
_edje_color_class_member_hash = evas_hash_add(_edje_color_class_member_hash, color_class, members);
}
void
_edje_color_class_member_del(Edje *ed, char *color_class)
{
Evas_List *members;
if ((!ed) || (!color_class)) return;
members = evas_hash_find(_edje_color_class_member_hash, color_class);
if (!members) return;
_edje_color_class_member_hash = evas_hash_del(_edje_color_class_member_hash, color_class, members);
members = evas_list_remove(members, ed);
if (members) _edje_color_class_member_hash = evas_hash_add(_edje_color_class_member_hash, color_class, members);
}
void
_edje_color_class_members_free(void)
{
if (!_edje_color_class_member_hash) return;
evas_hash_free(_edje_color_class_member_hash);
_edje_color_class_member_hash = NULL;
}
void
_edje_color_class_on_del(Edje *ed, Edje_Part *ep)
{
Evas_List *tmp;
if ((ep->default_desc) && (ep->default_desc->color_class)) _edje_color_class_member_del(ed, ep->default_desc->color_class);
for (tmp = ep->other_desc; tmp; tmp = tmp->next)
{
Edje_Part_Description *desc;
desc = tmp->data;
if (desc->color_class)
{
_edje_color_class_member_del(ed, desc->color_class);
desc->color_class = NULL;
}
}
}
Edje_Text_Class *
_edje_text_class_find(Edje *ed, char *text_class)
{
Evas_List *l;
if ((!ed) || (!text_class)) return NULL;
for (l = ed->text_classes; l; l = l->next)
{
Edje_Text_Class *tc;
tc = l->data;
if (!strcmp(text_class, tc->name)) return tc;
}
return evas_hash_find(_edje_text_class_hash, text_class);
}
void
_edje_text_class_member_add(Edje *ed, char *text_class)
{
Evas_List *members;
if ((!ed) || (!text_class)) return;
members = evas_hash_find(_edje_text_class_member_hash, text_class);
if (members) _edje_text_class_member_hash = evas_hash_del(_edje_text_class_member_hash, text_class, members);
members = evas_list_prepend(members, ed);
_edje_text_class_member_hash = evas_hash_add(_edje_text_class_member_hash, text_class, members);
}
void
_edje_text_class_member_del(Edje *ed, char *text_class)
{
Evas_List *members;
if ((!ed) || (!text_class)) return;
members = evas_hash_find(_edje_text_class_member_hash, text_class);
if (!members) return;
_edje_text_class_member_hash = evas_hash_del(_edje_text_class_member_hash, text_class, members);
members = evas_list_remove(members, ed);
if (members) _edje_text_class_member_hash = evas_hash_add(_edje_text_class_member_hash, text_class, members);
}
void
_edje_text_class_members_free(void)
{
if (!_edje_text_class_member_hash) return;
evas_hash_free(_edje_text_class_member_hash);
_edje_text_class_member_hash = NULL;
}
Edje *
_edje_fetch(Evas_Object *obj)
{
Edje *ed;
char *type;
type = (char *)evas_object_type_get(obj);
if (!type) return NULL;
if (strcmp(type, "edje")) return NULL;
ed = evas_object_smart_data_get(obj);
return ed;
}
int
_edje_glob_match(char *str, char *glob)
{
if (!fnmatch(glob, str, 0)) return 1;
return 0;
}
int
_edje_freeze(Edje *ed)
{
ed->freeze++;
return ed->freeze;
}
int
_edje_thaw(Edje *ed)
{
ed->freeze--;
if (ed->freeze < 0) ed->freeze = 0;
if ((ed->freeze == 0) && (ed->recalc)) _edje_recalc(ed);
return ed->freeze;
}
int
_edje_block(Edje *ed)
{
ed->block++;
return ed->block;
}
int
_edje_unblock(Edje *ed)
{
ed->block--;
if (ed->block == 0)
{
ed->block_break = 0;
ed->dont_clear_signals = 0;
if (ed->emissions) _edje_emit(ed, "", NULL);
}
return ed->block;
}
int
_edje_block_break(Edje *ed)
{
if (ed->block_break) return 1;
return 0;
}
void
_edje_block_violate(Edje *ed)
{
if (ed->block > 0) ed->block_break = 1;
}
void
_edje_object_part_swallow_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Object *edje_obj;
edje_obj = data;
edje_object_part_unswallow(edje_obj, obj);
return;
e = NULL;
event_info = NULL;
}