From 78ddad3dafea60c13c00c8565acc896f913e0a70 Mon Sep 17 00:00:00 2001 From: Sohyun Kim Date: Tue, 24 Feb 2015 18:26:18 +0100 Subject: [PATCH] edje: Add edje to text_class_member_hash properly. Summary: When textblock styles have text_classes, all edjes in the files were added to text_class_member_hash even if the edjes didn't use the textblock styles. It makes time long to update text_class. This will add the edje using the textblock style which has a text_class to text_class_member_hash. Reviewers: cedric, raster Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D2035 --- src/lib/edje/edje_load.c | 4 +- src/lib/edje/edje_private.h | 4 +- src/lib/edje/edje_text.c | 3 +- src/lib/edje/edje_textblock_styles.c | 134 ++++++++++++++++++++++----- 4 files changed, 115 insertions(+), 30 deletions(-) diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index b411fb8412..22eed37232 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -382,7 +382,6 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch edje_module_load(ed->file->external_dir->entries[i].entry); } - _edje_textblock_styles_add(ed); _edje_textblock_style_all_update(ed); ed->has_entries = EINA_FALSE; @@ -571,6 +570,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch _edje_callbacks_focus_add(rp->object, ed, rp); break; case EDJE_PART_TYPE_TEXTBLOCK: + _edje_textblock_styles_add(ed, rp); textblocks = eina_list_append(textblocks, rp); rp->object = evas_object_textblock_add(ed->base->evas); break; @@ -1407,11 +1407,11 @@ _edje_file_del(Edje *ed) Edje_Part *ep; unsigned int i; - _edje_textblock_styles_del(ed); for (i = 0; i < ed->collection->parts_count; ++i) { ep = ed->collection->parts[i]; + _edje_textblock_styles_del(ed, ep); _edje_text_part_on_del(ed, ep); _edje_color_class_on_del(ed, ep); } diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index f2d9f6c71b..476e196069 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -2362,8 +2362,8 @@ void _edje_message_queue_process (void); void _edje_message_queue_clear (void); void _edje_message_del (Edje *ed); -void _edje_textblock_styles_add(Edje *ed); -void _edje_textblock_styles_del(Edje *ed); +void _edje_textblock_styles_add(Edje *ed, Edje_Real_Part *ep); +void _edje_textblock_styles_del(Edje *ed, Edje_Part *pt); void _edje_textblock_styles_cache_free(Edje *ed, const char *text_class); void _edje_textblock_style_all_update(Edje *ed); void _edje_textblock_style_parse_and_fix(Edje_File *edf); diff --git a/src/lib/edje/edje_text.c b/src/lib/edje/edje_text.c index 05c2a6805f..c180122eeb 100644 --- a/src/lib/edje/edje_text.c +++ b/src/lib/edje/edje_text.c @@ -61,8 +61,7 @@ _edje_text_part_on_del(Edje *ed, Edje_Part *pt) unsigned int i; if (!pt) return; - if (pt->type != EDJE_PART_TYPE_TEXT - && pt->type != EDJE_PART_TYPE_TEXTBLOCK) + if (pt->type != EDJE_PART_TYPE_TEXT) return; desc = (Edje_Part_Description_Text *) pt->default_desc; diff --git a/src/lib/edje/edje_textblock_styles.c b/src/lib/edje/edje_textblock_styles.c index 5d423f74cf..0819b5e550 100644 --- a/src/lib/edje/edje_textblock_styles.c +++ b/src/lib/edje/edje_textblock_styles.c @@ -268,44 +268,130 @@ _edje_textblock_style_all_update(Edje *ed) } void -_edje_textblock_styles_add(Edje *ed) +_edje_textblock_styles_add(Edje *ed, Edje_Real_Part *ep) { - Eina_List *l, *ll; - Edje_Style *stl; + Edje_Part *pt = ep->part; + Edje_Part_Description_Text *desc; + Edje_Style *stl = NULL; + const char *style; + unsigned int i; - if (!ed->file) return; + if (pt->type != EDJE_PART_TYPE_TEXTBLOCK) return; - EINA_LIST_FOREACH(ed->file->styles, l, stl) + /* if text class exists in the textblock styles for this part, + add the edje to the tc member list */ + desc = (Edje_Part_Description_Text *)pt->default_desc; + style = edje_string_get(&desc->text.style); + if (style) { - Edje_Style_Tag *tag; + Eina_List *l; - /* Make sure the style contains the text_class */ - EINA_LIST_FOREACH(stl->tags, ll, tag) - { - if (!tag->text_class) continue; - _edje_text_class_member_add(ed, tag->text_class); - } + EINA_LIST_FOREACH(ed->file->styles, l, stl) + { + if ((stl->name) && (!strcmp(stl->name, style))) break; + stl = NULL; + } + } + if (stl) + { + Edje_Style_Tag *tag; + Eina_List *l; + + EINA_LIST_FOREACH(stl->tags, l, tag) + { + if (tag->text_class) + _edje_text_class_member_add(ed, tag->text_class); + } + } + + /* If any other classes exist add them */ + for (i = 0; i < pt->other.desc_count; ++i) + { + desc = (Edje_Part_Description_Text *)pt->other.desc[i]; + style = edje_string_get(&desc->text.style); + if (style) + { + Eina_List *l; + + EINA_LIST_FOREACH(ed->file->styles, l, stl) + { + if ((stl->name) && (!strcmp(stl->name, style))) break; + stl = NULL; + } + } + if (stl) + { + Edje_Style_Tag *tag; + Eina_List *l; + + EINA_LIST_FOREACH(stl->tags, l, tag) + { + if (tag->text_class) + _edje_text_class_member_add(ed, tag->text_class); + } + } } } void -_edje_textblock_styles_del(Edje *ed) +_edje_textblock_styles_del(Edje *ed, Edje_Part *pt) { - Eina_List *l, *ll; - Edje_Style *stl; + Edje_Part_Description_Text *desc; + Edje_Style *stl = NULL; + const char *style; + unsigned int i; - if (!ed->file) return; + if (pt->type != EDJE_PART_TYPE_TEXTBLOCK) return; - EINA_LIST_FOREACH(ed->file->styles, l, stl) + desc = (Edje_Part_Description_Text *)pt->default_desc; + style = edje_string_get(&desc->text.style); + if (style) { - Edje_Style_Tag *tag; + Eina_List *l; - /* Make sure the style contains the text_class */ - EINA_LIST_FOREACH(stl->tags, ll, tag) - { - if (!tag->text_class) continue; - _edje_text_class_member_del(ed, tag->text_class); - } + EINA_LIST_FOREACH(ed->file->styles, l, stl) + { + if ((stl->name) && (!strcmp(stl->name, style))) break; + stl = NULL; + } + } + if (stl) + { + Edje_Style_Tag *tag; + Eina_List *l; + + EINA_LIST_FOREACH(stl->tags, l, tag) + { + if (tag->text_class) + _edje_text_class_member_del(ed, tag->text_class); + } + } + + for (i = 0; i < pt->other.desc_count; ++i) + { + desc = (Edje_Part_Description_Text *)pt->other.desc[i]; + style = edje_string_get(&desc->text.style); + if (style) + { + Eina_List *l; + + EINA_LIST_FOREACH(ed->file->styles, l, stl) + { + if ((stl->name) && (!strcmp(stl->name, style))) break; + stl = NULL; + } + } + if (stl) + { + Edje_Style_Tag *tag; + Eina_List *l; + + EINA_LIST_FOREACH(stl->tags, l, tag) + { + if (tag->text_class) + _edje_text_class_member_del(ed, tag->text_class); + } + } } }