From 5f376fde368d3ea2b429790c31a753ccad00317d Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 22 Apr 2014 13:19:09 -0400 Subject: [PATCH] edje now correctly supports text.source and text.text_source for swallowed parts fix T1186 --- src/bin/edje/edje_cc.h | 2 ++ src/bin/edje/edje_cc_handlers.c | 8 +++---- src/bin/edje/edje_cc_out.c | 37 ++++++++++++++++++++++++++---- src/lib/edje/edje_calc.c | 35 ++++++++++++++++++----------- src/lib/edje/edje_data.c | 4 ++++ src/lib/edje/edje_private.h | 4 ++++ src/lib/edje/edje_text.c | 20 ++++++++++++----- src/lib/edje/edje_util.c | 40 +++++++++++++++++++++++++++++++++ 8 files changed, 123 insertions(+), 27 deletions(-) diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h index f43979c8d7..5f4a92385e 100644 --- a/src/bin/edje/edje_cc.h +++ b/src/bin/edje/edje_cc.h @@ -170,6 +170,8 @@ void data_write(void); void data_queue_face_group_lookup(const char *name); void data_queue_group_lookup(const char *name, Edje_Part *part); void data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest); +void data_queue_part_nest_lookup(Edje_Part_Collection *pc, const char *name, int *dest, char **dest2); +void data_queue_copied_part_nest_lookup(Edje_Part_Collection *pc, int *src, int *dest, char **dest2); void data_queue_part_reallocated_lookup(Edje_Part_Collection *pc, const char *name, unsigned char **base, int offset); void data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest); diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index 6ac0b7127d..3922ed121d 100644 --- a/src/bin/edje/edje_cc_handlers.c +++ b/src/bin/edje/edje_cc_handlers.c @@ -6273,8 +6273,8 @@ st_collections_group_parts_part_description_inherit(void) ted->text.font.str = STRDUP(ted->text.font.str); ted->text.filter.str = STRDUP(ted->text.filter.str); - data_queue_copied_part_lookup(pc, &(tparent->text.id_source), &(ted->text.id_source)); - data_queue_copied_part_lookup(pc, &(tparent->text.id_text_source), &(ted->text.id_text_source)); + data_queue_copied_part_nest_lookup(pc, &(tparent->text.id_source), &(ted->text.id_source), &ted->text.id_source_part); + data_queue_copied_part_nest_lookup(pc, &(tparent->text.id_text_source), &(ted->text.id_text_source), &ted->text.id_text_source_part); break; } @@ -8312,7 +8312,7 @@ st_collections_group_parts_part_description_text_source(void) char *name; name = parse_str(0); - data_queue_part_lookup(pc, name, &(ed->text.id_source)); + data_queue_part_nest_lookup(pc, name, &(ed->text.id_source), &ed->text.id_source_part); free(name); } } @@ -8353,7 +8353,7 @@ st_collections_group_parts_part_description_text_text_source(void) char *name; name = parse_str(0); - data_queue_part_lookup(pc, name, &(ed->text.id_text_source)); + data_queue_part_nest_lookup(pc, name, &(ed->text.id_text_source), &ed->text.id_text_source_part); free(name); } } diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c index 4cd2d7e256..1cd500ee16 100644 --- a/src/bin/edje/edje_cc_out.c +++ b/src/bin/edje/edje_cc_out.c @@ -50,6 +50,7 @@ struct _Part_Lookup_Key int offset; } reallocated; } mem; + char **dest2; Eina_Bool stable : 1; }; @@ -2163,6 +2164,12 @@ data_queue_face_group_lookup(const char *name) void data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest) +{ + data_queue_part_nest_lookup(pc, name, dest, NULL); +} + +void +data_queue_part_nest_lookup(Edje_Part_Collection *pc, const char *name, int *dest, char **dest2) { Part_Lookup_Key key; Part_Lookup *pl = NULL; @@ -2195,6 +2202,7 @@ data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest) pl->name = mem_strdup(name); pl->key.pc = pc; pl->key.mem.dest = dest; + pl->key.dest2 = dest2; pl->key.stable = EINA_TRUE; eina_hash_add(part_pc_dest_lookup, &key, pl); @@ -2252,6 +2260,12 @@ data_queue_part_reallocated_lookup(Edje_Part_Collection *pc, const char *name, void data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest) +{ + data_queue_copied_part_nest_lookup(pc, src, dest, NULL); +} + +void +data_queue_copied_part_nest_lookup(Edje_Part_Collection *pc, int *src, int *dest, char **dest2) { Eina_List *list; Eina_List *l; @@ -2265,7 +2279,7 @@ data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest) list = eina_hash_find(part_dest_lookup, &key); EINA_LIST_FOREACH(list, l, pl) if (pl->key.stable) - data_queue_part_lookup(pc, pl->name, dest); + data_queue_part_nest_lookup(pc, pl->name, dest, dest2); } void @@ -2454,18 +2468,20 @@ data_queue_copied_image_lookup(int *src, int *dest, Eina_Bool *set) } } -static void +static Eina_Bool data_process_part_set(Part_Lookup *target, int value) { if (target->key.stable) { *(target->key.mem.dest) = value; + if (target->key.dest2) return EINA_TRUE; } else { *((int*)(*target->key.mem.reallocated.base + target->key.mem.reallocated.offset)) = value; } + return EINA_FALSE; } static void @@ -2621,17 +2637,30 @@ data_process_lookups(void) } else { - char *alias; + char *alias, *ap; + alias = eina_hash_find(part->key.pc->alias, part->name); if (!alias) alias = part->name; + ap = strchr(alias, EDJE_PART_PATH_SEPARATOR); + if (ap) + { + char *tmp; + + tmp = alloca(strlen(alias) + 1); + memcpy(tmp, alias, ap - alias); + tmp[ap - alias] = 0; + ap += 1; + alias = tmp; + } for (i = 0; i < part->key.pc->parts_count; ++i) { ep = part->key.pc->parts[i]; if ((ep->name) && (!strcmp(ep->name, alias))) { - data_process_part_set(part, ep->id); + if (data_process_part_set(part, ep->id)) + *part->key.dest2 = ap; break; } } diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index 073827c69c..1a97616fa0 100644 --- a/src/lib/edje/edje_calc.c +++ b/src/lib/edje/edje_calc.c @@ -1225,9 +1225,12 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, if (chosen_desc->text.id_source >= 0) { + Edje_Part_Description_Text *et; + ep->typedata.text->source = ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size]; - tmp = edje_string_get(&((Edje_Part_Description_Text *)ep->typedata.text->source->chosen_description)->text.style); + et = _edje_real_part_text_source_description_get(ep, NULL); + tmp = edje_string_get(&et->text.style); if (tmp) style = tmp; } else @@ -1240,10 +1243,15 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, if (chosen_desc->text.id_text_source >= 0) { - ep->typedata.text->text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size]; - text = edje_string_get(&((Edje_Part_Description_Text*)ep->typedata.text->text_source->chosen_description)->text.text); + Edje_Part_Description_Text *et; + Edje_Real_Part *rp; - if (ep->typedata.text->text_source->typedata.text->text) text = ep->typedata.text->text_source->typedata.text->text; + ep->typedata.text->text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size]; + + et = _edje_real_part_text_text_source_description_get(ep, &rp); + text = edje_string_get(&et->text.text); + + if (rp->typedata.text->text) text = rp->typedata.text->text; } else { @@ -1519,44 +1527,45 @@ _edje_part_recalc_single_text(FLOAT_T sc EINA_UNUSED, const char *font; Evas_Coord tw, th; int inlined_font = 0; + Edje_Real_Part *source, *text_source; /* Update a object_text part */ if (chosen_desc->text.id_source >= 0) ep->text.source = ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size]; else - ep->text.source = NULL; + source = ep->text.source = NULL; if (chosen_desc->text.id_text_source >= 0) ep->text.text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size]; else - ep->text.text_source = NULL; + text_source = ep->text.text_source = NULL; if (ep->text.text_source) - text = edje_string_get(&(((Edje_Part_Description_Text*)ep->text.text_source->chosen_description)->text.text)); + text = edje_string_get(&_edje_real_part_text_text_source_description_get(ep, &text_source)->text.text)); else text = edje_string_get(&chosen_desc->text.text); if (ep->text.source) - font = _edje_text_class_font_get(ed, ((Edje_Part_Description_Text*)ep->text.source->chosen_description), &size, &sfont); + font = _edje_text_class_font_get(ed, _edje_real_part_text_source_description_get(ep, &source)), &size, &sfont); else font = _edje_text_class_font_get(ed, chosen_desc, &size, &sfont); if (!font) font = ""; - if (ep->text.text_source) + if (text_source) { - if (ep->text.text_source->text.text) text = ep->text.text_source->text.text; + if (text_source->text.text) text = text_source->text.text; } else { if (ep->text.text) text = ep->text.text; } - if (ep->text.source) + if (source) { - if (ep->text.source->text.font) font = ep->text.source->text.font; - if (ep->text.source->text.size > 0) size = ep->text.source->text.size; + if (source->text.font) font = source->text.font; + if (source->text.size > 0) size = source->text.size; } else { diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c index a6d7c8124a..63f895279b 100644 --- a/src/lib/edje/edje_data.c +++ b/src/lib/edje/edje_data.c @@ -825,7 +825,9 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.align.x", text.align.x, EDJE_T_FLOAT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.align.y", text.align.y, EDJE_T_FLOAT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.id_source", text.id_source, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.id_source_part", text.id_source_part, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.id_text_source", text.id_text_source, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.id_text_source_part", text.id_text_source_part, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.elipsis", text.elipsis, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter", text.filter, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_LIST_STRING(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter_sources", text.filter_sources); @@ -857,7 +859,9 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.align.x", text.align.x, EDJE_T_FLOAT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.align.y", text.align.y, EDJE_T_FLOAT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.id_source", text.id_source, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.id_source_part", text.id_source_part, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.id_text_source", text.id_text_source, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.id_text_source_part", text.id_text_source_part, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.elipsis", text.elipsis, EET_T_DOUBLE); EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Box); diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index 1c756b2a9f..eb3c3c66e4 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -1205,7 +1205,9 @@ struct _Edje_Part_Description_Spec_Text double elipsis; /* 0.0 - 1.0 defining where the elipsis align */ int size; /* 0 = use user set size */ int id_source; /* -1 if none */ + char *id_source_part; int id_text_source; /* -1 if none */ + char *id_text_source_part; unsigned char fit_x; /* resize font size down to fit in x dir */ unsigned char fit_y; /* resize font size down to fit in y dir */ @@ -2100,6 +2102,8 @@ void _edje_box_layout_remove_child(Edje_Real_Part *rp, Evas_Object Edje_Part_Box_Animation * _edje_box_layout_anim_new(Evas_Object *box); void _edje_box_layout_free_data(void *data); +Edje_Part_Description_Text *_edje_real_part_text_source_description_get(Edje_Real_Part *ep, Edje_Real_Part **rp2); +Edje_Part_Description_Text *_edje_real_part_text_text_source_description_get(Edje_Real_Part *ep, Edje_Real_Part **rp2); Eina_Bool _edje_real_part_box_append(Edje *ed, Edje_Real_Part *rp, Evas_Object *child_obj); Eina_Bool _edje_real_part_box_prepend(Edje *ed, Edje_Real_Part *rp, Evas_Object *child_obj); Eina_Bool _edje_real_part_box_insert_before(Edje *ed, Edje_Real_Part *rp, Evas_Object *child_obj, const Evas_Object *ref); diff --git a/src/lib/edje/edje_text.c b/src/lib/edje/edje_text.c index 8e1697ddb6..4add65f645 100644 --- a/src/lib/edje/edje_text.c +++ b/src/lib/edje/edje_text.c @@ -198,15 +198,23 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (ep->typedata.text->text_source) { - text = edje_string_get(&(((Edje_Part_Description_Text *)ep->typedata.text->text_source->chosen_description)->text.text)); - if (ep->typedata.text->text_source->typedata.text->text) text = ep->typedata.text->text_source->typedata.text->text; + Edje_Part_Description_Text *et; + Edje_Real_Part *rp2; + + et = _edje_real_part_text_text_source_description_get(ep, &rp2); + text = edje_string_get(&(et->text.text)); + if (rp2->typedata.text->text) text = rp2->typedata.text->text; } if (ep->typedata.text->source) { - font = edje_string_get(&(((Edje_Part_Description_Text *)ep->typedata.text->source->chosen_description)->text.font)); - size = ((Edje_Part_Description_Text *)ep->typedata.text->source->chosen_description)->text.size; - if (ep->typedata.text->source->typedata.text->font) font = ep->typedata.text->source->typedata.text->font; - if (ep->typedata.text->source->typedata.text->size > 0) size = ep->typedata.text->source->typedata.text->size; + Edje_Part_Description_Text *et; + Edje_Real_Part *rp2; + + et = _edje_real_part_text_source_description_get(ep, &rp2); + font = edje_string_get(&(et->text.font)); + size = et->text.size; + if (rp2->typedata.text->font) font = rp2->typedata.text->font; + if (rp2->typedata.text->size > 0) size = rp2->typedata.text->size; } if (!text) text = ""; diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c index 2dd2d27cb3..f8f6dee63c 100644 --- a/src/lib/edje/edje_util.c +++ b/src/lib/edje/edje_util.c @@ -4467,6 +4467,46 @@ _edje_real_part_table_clear(Edje *ed, Edje_Real_Part *rp, Eina_Bool clear) } } +Edje_Part_Description_Text * +_edje_real_part_text_source_description_get(Edje_Real_Part *ep, Edje_Real_Part **rp2) +{ + Edje_Part_Description_Text *et; + Edje_Real_Part *rp = ep->typedata.text->source; + if (ep->typedata.text->source->type == EDJE_RP_TYPE_SWALLOW) + { + Edje *ed2; + + et = (Edje_Part_Description_Text *)ep->param1.description; + ed2 = _edje_fetch(ep->typedata.text->source->typedata.swallow->swallowed_object); + rp = _edje_real_part_recursive_get(&ed2, et->text.id_source_part); + et = (Edje_Part_Description_Text *)rp->chosen_description; + } + else + et = (Edje_Part_Description_Text *)ep->typedata.text->source->chosen_description; + if (rp2) *rp2 = rp; + return et; +} + +Edje_Part_Description_Text * +_edje_real_part_text_text_source_description_get(Edje_Real_Part *ep, Edje_Real_Part **rp2) +{ + Edje_Part_Description_Text *et; + Edje_Real_Part *rp = ep->typedata.text->text_source; + if (ep->typedata.text->text_source->type == EDJE_RP_TYPE_SWALLOW) + { + Edje *ed2; + + et = (Edje_Part_Description_Text *)ep->param1.description; + ed2 = _edje_fetch(ep->typedata.text->text_source->typedata.swallow->swallowed_object); + rp = _edje_real_part_recursive_get(&ed2, et->text.id_text_source_part); + et = (Edje_Part_Description_Text *)rp->chosen_description; + } + else + et = (Edje_Part_Description_Text *)ep->typedata.text->text_source->chosen_description; + if (rp2) *rp2 = rp; + return et; +} + Edje_Real_Part * _edje_real_part_recursive_get(Edje **ed, const char *part) {