edje now correctly supports text.source and text.text_source for swallowed parts

fix T1186
This commit is contained in:
Mike Blumenkrantz 2014-04-22 13:19:09 -04:00
parent d498f6f723
commit 5f376fde36
8 changed files with 123 additions and 27 deletions

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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
{

View File

@ -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);

View File

@ -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);

View File

@ -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 = "";

View File

@ -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)
{