discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=5f376fde368d3ea2b429790c31a753ccad00317d

commit 5f376fde368d3ea2b429790c31a753ccad00317d
Author: Mike Blumenkrantz <[email protected]>
Date:   Tue Apr 22 13:19:09 2014 -0400

    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        | 33 +++++++++++++++++++++------------
 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, 122 insertions(+), 26 deletions(-)

diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h
index f43979c..5f4a923 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 6ac0b71..3922ed1 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 4cd2d7e..1cd500e 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;
 };
@@ -2164,6 +2165,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;
    Eina_List *list;
@@ -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);
@@ -2253,6 +2261,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;
    Part_Lookup *pl;
@@ -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 073827c..1a97616 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)
           {
+             Edje_Part_Description_Text *et;
+             Edje_Real_Part *rp;
+
              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);
 
-             if (ep->typedata.text->text_source->typedata.text->text) text = 
ep->typedata.text->text_source->typedata.text->text;
+             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 a6d7c81..63f8952 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 1c756b2..eb3c3c6 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 8e1697d..4add65f 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 2dd2d27..f8f6dee 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)
 {

-- 


Reply via email to