From 17678212d6418b13a8654087213d09eecb973ff1 Mon Sep 17 00:00:00 2001 From: rbdpngn Date: Tue, 4 Nov 2003 06:15:19 +0000 Subject: [PATCH] Global text and color class manipulation. Settings on individual edje's will override the global values. SVN revision: 7795 --- legacy/edje/data/src/e_logo.edc | 2 + legacy/edje/src/bin/edje_main.c | 15 +- legacy/edje/src/lib/Edje.h | 3 + legacy/edje/src/lib/edje_calc.c | 7 +- legacy/edje/src/lib/edje_load.c | 12 +- legacy/edje/src/lib/edje_private.h | 5 + legacy/edje/src/lib/edje_text.c | 34 ++++- legacy/edje/src/lib/edje_util.c | 214 ++++++++++++++++++++++++++++- 8 files changed, 278 insertions(+), 14 deletions(-) diff --git a/legacy/edje/data/src/e_logo.edc b/legacy/edje/data/src/e_logo.edc index de3222878f..f5dfcbb981 100644 --- a/legacy/edje/data/src/e_logo.edc +++ b/legacy/edje/data/src/e_logo.edc @@ -177,11 +177,13 @@ collections { offset, -64, -1; to, "logo"; } + color_class, "fg"; color, 255 255 255 255; // color2, 0 0 255 255; color3, 0 0 0 32; text { text, "This is a longer test string"; + text_class, "plainjane"; font, "Vera"; size, 6; // fit, 0 1; diff --git a/legacy/edje/src/bin/edje_main.c b/legacy/edje/src/bin/edje_main.c index 20973eb95d..d2a4158f69 100644 --- a/legacy/edje/src/bin/edje_main.c +++ b/legacy/edje/src/bin/edje_main.c @@ -232,10 +232,17 @@ bg_key_down(void *data, Evas * e, Evas_Object * obj, void *event_info) else if (!strcmp(ev->keyname, "Right")) edje_object_part_text_set(de->edje, "text", "You pressed \"U\". Nice one stenchie!"); else if (!strcmp(ev->keyname, "F1")) - edje_object_color_class_set(de->edje, "bg", - 255, 255, 255, 255, - 0, 0, 0, 0, - 0, 0, 0, 0); + { + edje_object_color_class_set(de->edje, "bg", + 255, 255, 255, 255, + 0, 0, 0, 0, + 0, 0, 0, 0); + edje_color_class_set("fg", + 0, 0, 0, 255, + 0, 0, 0, 0, + 0, 0, 0, 0); + edje_text_class_set("plainjane", "Vera", 10); + } else if (!strcmp(ev->keyname, "F2")) edje_object_color_class_set(de->edje, "bg", 255, 200, 120, 255, diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 475427ad67..fb11c11164 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -29,6 +29,9 @@ extern "C" { Evas_List *edje_file_collection_list (const char *file); void edje_file_collection_list_free (Evas_List *lst); char *edje_file_data_get (const char *file, const char *key); + + 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); + void edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size); void edje_extern_object_min_size_set (Evas_Object *obj, Evas_Coord minw, Evas_Coord minh); void edje_extern_object_max_size_set (Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh); diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index e9ab4083a3..be8101cf9e 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -418,8 +418,11 @@ _edje_part_recalc_single(Edje *ed, Edje_Text_Class *tc; tc = _edje_text_class_find(ed, chosen_desc->text.text_class); - if (tc->font) font = tc->font; - if (tc->size > 0) size = tc->size; + if (tc) + { + if (tc->font) font = tc->font; + if (tc->size > 0) size = tc->size; + } } if (ep->text.text) text = ep->text.text; diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 48ea221a1b..0b36148b08 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -40,8 +40,17 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part) { Edje_Part *ep; Evas_List *hist = NULL; - + + /* Register any color classes in this parts descriptions. */ ep = l->data; + if ((ep->default_desc) && (ep->default_desc->color_class)) _edje_color_class_member_add(ed, ep->default_desc->color_class); + for (hist = ep->other_desc; hist; hist = hist->next) + { + Edje_Part_Description *desc; + + desc = hist->data; + if (desc->color_class) _edje_color_class_member_add(ed, desc->color_class); + } hist = evas_list_append(hist, ep); while (ep->dragable.confine_id >= 0) { @@ -459,6 +468,7 @@ _edje_file_del(Edje *ed) EVAS_CALLBACK_MOUSE_WHEEL, _edje_mouse_wheel_cb); _edje_text_part_on_del(ed, rp); + _edje_color_class_on_del(ed, rp); evas_object_del(rp->object); if (rp->swallowed_object) { diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 781854e256..848e7b42c2 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -586,7 +586,12 @@ void _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *pa Edje_Real_Part *_edje_real_part_get(Edje *ed, char *part); Edje_Color_Class *_edje_color_class_find(Edje *ed, char *color_class); +void _edje_color_class_member_add(Edje *ed, char *color_class); +void _edje_color_class_member_del(Edje *ed, char *color_class); +void _edje_color_class_on_del(Edje *ed, Edje_Real_Part *rp); Edje_Text_Class *_edje_text_class_find(Edje *ed, char *text_class); +void _edje_text_class_member_add(Edje *ed, char *text_class); +void _edje_text_class_member_del(Edje *ed, char *text_class); Edje *_edje_fetch(Evas_Object *obj); int _edje_glob_match(char *str, char *glob); int _edje_freeze(Edje *ed); diff --git a/legacy/edje/src/lib/edje_text.c b/legacy/edje/src/lib/edje_text.c index 7f18a787e9..43acb5406e 100644 --- a/legacy/edje/src/lib/edje_text.c +++ b/legacy/edje/src/lib/edje_text.c @@ -1,6 +1,8 @@ #include "Edje.h" #include "edje_private.h" +static Evas_Hash *_edje_text_class_hash = NULL; + Edje_Text_Style _edje_text_styles[EDJE_TEXT_EFFECT_LAST]; void @@ -175,6 +177,8 @@ void _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep) { int i; + Evas_List *tmp; + Edje_Part *pt = ep->part; if (ep->part->type != EDJE_PART_TYPE_TEXT) return; if (ep->part->effect >= EDJE_TEXT_EFFECT_LAST) return; @@ -188,6 +192,16 @@ _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep) evas_object_clip_set(o, ed->clipper); evas_object_show(o); ep->extra_objects = evas_list_append(ep->extra_objects, o); + + } + + if ((pt->default_desc) && (pt->default_desc->text.text_class)) _edje_text_class_member_add(ed, pt->default_desc->text.text_class); + for (tmp = pt->other_desc; tmp; tmp = tmp->next) + { + Edje_Part_Description *desc; + + desc = tmp->data; + if ((desc) && (desc->text.text_class)) _edje_text_class_member_add(ed, desc->text.text_class); } } @@ -217,6 +231,9 @@ _edje_text_part_on_add_clippers(Edje *ed, Edje_Real_Part *ep) void _edje_text_part_on_del(Edje *ed, Edje_Real_Part *ep) { + Evas_List *tmp; + Edje_Part *pt = ep->part; + while (ep->extra_objects) { Evas_Object *o; @@ -225,8 +242,16 @@ _edje_text_part_on_del(Edje *ed, Edje_Real_Part *ep) ep->extra_objects = evas_list_remove(ep->extra_objects, o); evas_object_del(o); } + + if ((pt->default_desc) && (pt->default_desc->text.text_class)) _edje_text_class_member_del(ed, pt->default_desc->text.text_class); + for (tmp = pt->other_desc; tmp; tmp = tmp->next) + { + Edje_Part_Description *desc; + + desc = tmp->data; + if (desc->text.text_class) _edje_text_class_member_del(ed, desc->text.text_class); + } return; - ed = NULL; } void @@ -250,8 +275,11 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Text_Class *tc; tc = _edje_text_class_find(ed, chosen_desc->text.text_class); - if (tc->font) font = tc->font; - if (tc->size > 0) size = tc->size; + if (tc) + { + if (tc->font) font = tc->font; + if (tc->size > 0) size = tc->size; + } } if (ep->text.text) text = ep->text.text; diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index 02f8141f2f..df1c1e38ac 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -1,6 +1,12 @@ #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) { @@ -59,6 +65,75 @@ edje_object_thaw(Evas_Object *obj) 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) { @@ -106,6 +181,7 @@ edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, in } } cc = malloc(sizeof(Edje_Color_Class)); + if (!cc) return; cc->name = strdup(color_class); if (!cc->name) { @@ -129,6 +205,65 @@ edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, in _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) { @@ -161,6 +296,7 @@ edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char } } tc = malloc(sizeof(Edje_Text_Class)); + if (!tc) return; tc->name = strdup(text_class); if (!tc->name) { @@ -876,7 +1012,7 @@ _edje_color_class_find(Edje *ed, char *color_class) { Evas_List *l; - if (!color_class) return NULL; + if ((!ed) || (!color_class)) return; for (l = ed->color_classes; l; l = l->next) { Edje_Color_Class *cc; @@ -884,7 +1020,50 @@ _edje_color_class_find(Edje *ed, char *color_class) cc = l->data; if (!strcmp(color_class, cc->name)) return cc; } - return NULL; + 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, *tmp = NULL; + + 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_on_del(Edje *ed, Edje_Real_Part *rp) +{ + Evas_List *tmp; + Edje_Part *ep = rp->part; + + 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); + } } Edje_Text_Class * @@ -892,7 +1071,7 @@ _edje_text_class_find(Edje *ed, char *text_class) { Evas_List *l; - if (!text_class) return NULL; + if ((!ed) || (!text_class)) return; for (l = ed->text_classes; l; l = l->next) { Edje_Text_Class *tc; @@ -900,7 +1079,34 @@ _edje_text_class_find(Edje *ed, char *text_class) tc = l->data; if (!strcmp(text_class, tc->name)) return tc; } - return NULL; + 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, *tmp = NULL; + + 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); } Edje *