zmike pushed a commit to branch master.

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

commit f5d3f575c6b77e882ec26f9910276cf9ab1c299d
Author: Mike Blumenkrantz <zm...@samsung.com>
Date:   Wed Jul 10 14:24:53 2019 -0400

    edje: improve user-defined data caching to handle data before file is set
    
    Summary:
    this adds explicit handling for things like:
    
    efl_add(SOMECLASS, parent,
      efl_text_set(efl_added, "my text")
    );
    
    on edje-inheriting objects.
    
    note that it's still impossible to do something like
    efl_add(SOMECLASS, parent,
      efl_text_set(efl_part(efl_added, "somepart"), "my text")
    );
    
    also add a unit test to verify common behaviors
    
    @feature
    
    Depends on D9209
    
    Reviewers: cedric
    
    Reviewed By: cedric
    
    Subscribers: bu5hm4n, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D9210
---
 src/lib/edje/edje_load.c                  |   5 +
 src/lib/edje/edje_util.c                  | 162 ++++++++++++++++++++----------
 src/tests/elementary/efl_ui_test_layout.c |  17 ++++
 3 files changed, 132 insertions(+), 52 deletions(-)

diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index 0e257a902d..5170411700 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -779,6 +779,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const 
Eina_File *file, const ch
    int group_path_started = 0;
    Evas_Object *nested_smart = NULL;
    char lang[PATH_MAX];
+   Eina_Bool had_file;
    Eina_Hash *part_match = NULL;
 
    /* Get data pointer of top-of-stack */
@@ -793,6 +794,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const 
Eina_File *file, const ch
      {
         return 0;
      }
+   had_file = !!ed->file;
 
    tev = evas_object_evas_get(obj);
    evas_event_freeze(tev);
@@ -1696,6 +1698,9 @@ _edje_object_file_set_internal(Evas_Object *obj, const 
Eina_File *file, const ch
                                            break;
                                         }
                                       eina_stringshare_del(eud->u.string.text);
+                                      /* string has extra ref in this case */
+                                      if (!had_file)
+                                        
eina_stringshare_del(eud->u.string.text);
                                       break;
 
                                     case EDJE_USER_TEXT_STYLE:
diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c
index 827c95c0d1..5b5692beb3 100644
--- a/src/lib/edje/edje_util.c
+++ b/src/lib/edje/edje_util.c
@@ -2103,6 +2103,12 @@ _edje_efl_text_text_set(Eo *obj, Edje *ed, const char 
*part, const char *text,
    Eina_Bool int_ret;
 
    if ((!ed) || (!part)) return EINA_FALSE;
+   if ((!ed->file) && (!legacy))
+     {
+        _edje_user_define_string(ed, part, eina_stringshare_add(text),
+          set_markup ? EDJE_TEXT_TYPE_MARKUP : EDJE_TEXT_TYPE_NORMAL);
+        return EINA_TRUE;
+     }
    rp = _edje_real_part_recursive_get(&ed, part);
    if (!rp) return EINA_FALSE;
    if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
@@ -3035,6 +3041,16 @@ _edje_efl_content_content_set(Edje *ed, const char 
*part, Efl_Gfx_Entity *obj_sw
           }
      }
 
+   if (!ed->file)
+     {
+        eud = _edje_user_definition_new(EDJE_USER_SWALLOW, part, ed);
+        if (eud)
+          {
+             evas_object_event_callback_add(obj_swallow, EVAS_CALLBACK_DEL, 
_edje_user_def_del_cb, eud);
+             eud->u.swallow.child = obj_swallow;
+          }
+        return EINA_TRUE;
+     }
    if (!rp)
      {
         DBG("cannot swallow part %s: part not exist!", part);
@@ -3919,14 +3935,17 @@ _edje_object_part_drag_dir_get(Edje *ed, const char 
*part)
 Eina_Bool
 _edje_object_part_drag_value_set(Edje *ed, const char *part, double dx, double 
dy)
 {
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    Edje_User_Defined *eud;
    Eina_List *l, *ll;
 
    if ((!ed) || (!part)) return EINA_FALSE;
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return EINA_FALSE;
-   if (!rp->drag) return EINA_FALSE;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return EINA_FALSE;
+        if (!rp->drag) return EINA_FALSE;
+     }
 
    l = eina_hash_find(ed->user_defined, part);
    EINA_LIST_FOREACH(l, ll, eud)
@@ -3945,6 +3964,7 @@ _edje_object_part_drag_value_set(Edje *ed, const char 
*part, double dx, double d
              eud->u.drag_position.y = dy;
           }
      }
+   if (!ed->file) return EINA_TRUE;
 
    if (rp->part->dragable.confine_id != -1)
      {
@@ -4005,14 +4025,17 @@ _edje_object_part_drag_value_get(Edje *ed, const char 
*part, double *dx, double
 Eina_Bool
 _edje_object_part_drag_size_set(Edje *ed, const char *part, double dw, double 
dh)
 {
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    Edje_User_Defined *eud;
    Eina_List *l, *ll;
 
    if ((!ed) || (!part)) return EINA_FALSE;
    rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return EINA_FALSE;
-   if (!rp->drag) return EINA_FALSE;
+   if (ed->file)
+     {
+        if (!rp) return EINA_FALSE;
+        if (!rp->drag) return EINA_FALSE;
+     }
 
    l = eina_hash_find(ed->user_defined, part);
    EINA_LIST_FOREACH(l, ll, eud)
@@ -4031,6 +4054,7 @@ _edje_object_part_drag_size_set(Edje *ed, const char 
*part, double dw, double dh
              eud->u.drag_size.h = dh;
           }
      }
+   if (!ed->file) return EINA_TRUE;
 
    if (dw < 0.0) dw = 0.0;
    else if (dw > 1.0)
@@ -4085,14 +4109,17 @@ _edje_object_part_drag_size_get(Edje *ed, const char 
*part, double *dw, double *
 Eina_Bool
 _edje_object_part_drag_step_set(Edje *ed, const char *part, double dx, double 
dy)
 {
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    Edje_User_Defined *eud;
    Eina_List *l, *ll;
 
    if ((!ed) || (!part)) return EINA_FALSE;
    rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return EINA_FALSE;
-   if (!rp->drag) return EINA_FALSE;
+   if (ed->file)
+     {
+        if (!rp) return EINA_FALSE;
+        if (!rp->drag) return EINA_FALSE;
+     }
 
    l = eina_hash_find(ed->user_defined, part);
    EINA_LIST_FOREACH(l, ll, eud)
@@ -4111,6 +4138,7 @@ _edje_object_part_drag_step_set(Edje *ed, const char 
*part, double dx, double dy
              eud->u.drag_position.y = dy;
           }
      }
+   if (!ed->file) return EINA_TRUE;
 
    if (dx < 0.0) dx = 0.0;
    else if (dx > 1.0)
@@ -4158,14 +4186,17 @@ _edje_object_part_drag_step_get(Edje *ed, const char 
*part, double *dx, double *
 Eina_Bool
 _edje_object_part_drag_page_set(Edje *ed, const char *part, double dx, double 
dy)
 {
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    Edje_User_Defined *eud;
    Eina_List *l, *ll;
 
    if ((!ed) || (!part)) return EINA_FALSE;
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return EINA_FALSE;
-   if (!rp->drag) return EINA_FALSE;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return EINA_FALSE;
+        if (!rp->drag) return EINA_FALSE;
+     }
 
    l = eina_hash_find(ed->user_defined, part);
    EINA_LIST_FOREACH(l, ll, eud)
@@ -4184,6 +4215,7 @@ _edje_object_part_drag_page_set(Edje *ed, const char 
*part, double dx, double dy
              eud->u.drag_position.y = dy;
           }
      }
+   if (!ed->file) return EINA_TRUE;
 
    if (dx < 0.0) dx = 0.0;
    else if (dx > 1.0)
@@ -4231,15 +4263,18 @@ _edje_object_part_drag_page_get(Edje *ed, const char 
*part, double *dx, double *
 Eina_Bool
 _edje_object_part_drag_step(Edje *ed, const char *part, double dx, double dy)
 {
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    FLOAT_T px, py;
    Edje_User_Defined *eud;
    Eina_List *l, *ll;
 
    if ((!ed) || (!part)) return EINA_FALSE;
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return EINA_FALSE;
-   if (!rp->drag) return EINA_FALSE;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return EINA_FALSE;
+        if (!rp->drag) return EINA_FALSE;
+     }
 
    l = eina_hash_find(ed->user_defined, part);
    EINA_LIST_FOREACH(l, ll, eud)
@@ -4258,6 +4293,7 @@ _edje_object_part_drag_step(Edje *ed, const char *part, 
double dx, double dy)
              eud->u.drag_position.y = dy;
           }
      }
+   if (!ed->file) return EINA_TRUE;
 
    px = rp->drag->val.x;
    py = rp->drag->val.y;
@@ -4283,15 +4319,18 @@ _edje_object_part_drag_step(Edje *ed, const char *part, 
double dx, double dy)
 Eina_Bool
 _edje_object_part_drag_page(Edje *ed, const char *part, double dx, double dy)
 {
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    FLOAT_T px, py;
    Edje_User_Defined *eud;
    Eina_List *l, *ll;
 
    if ((!ed) || (!part)) return EINA_FALSE;
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return EINA_FALSE;
-   if (!rp->drag) return EINA_FALSE;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return EINA_FALSE;
+        if (!rp->drag) return EINA_FALSE;
+     }
 
    l = eina_hash_find(ed->user_defined, part);
    EINA_LIST_FOREACH(l, ll, eud)
@@ -4310,6 +4349,7 @@ _edje_object_part_drag_page(Edje *ed, const char *part, 
double dx, double dy)
              eud->u.drag_position.y = dy;
           }
      }
+   if (!ed->file) return EINA_TRUE;
 
    px = rp->drag->val.x;
    py = rp->drag->val.y;
@@ -4350,16 +4390,19 @@ Eina_Bool
 _edje_part_box_append(Edje *ed, const char *part, Evas_Object *child)
 {
    Eina_Bool ret;
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    ret = EINA_FALSE;
 
    if ((!ed) || (!part) || (!child)) return ret;
 
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return ret;
-   if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return ret;
+        if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+     }
 
-   if (_edje_real_part_box_append(ed, rp, child))
+   if ((!ed->file) || _edje_real_part_box_append(ed, rp, child))
      {
         Edje_User_Defined *eud;
 
@@ -4379,16 +4422,19 @@ Eina_Bool
 _edje_part_box_prepend(Edje *ed, const char *part, Evas_Object *child)
 {
    Eina_Bool ret;
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    ret = EINA_FALSE;
 
    if ((!ed) || (!part)) return ret;
 
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return ret;
-   if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return ret;
+        if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+     }
 
-   if (_edje_real_part_box_prepend(ed, rp, child))
+   if ((!ed->file) || _edje_real_part_box_prepend(ed, rp, child))
      {
         Edje_User_Defined *eud;
 
@@ -4407,16 +4453,19 @@ Eina_Bool
 _edje_part_box_insert_before(Edje *ed, const char *part, Evas_Object *child, 
const Evas_Object *reference)
 {
    Eina_Bool ret;
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    ret = EINA_FALSE;
 
    if ((!ed) || (!part)) return ret;
 
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return ret;
-   if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return ret;
+        if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+     }
 
-   if (_edje_real_part_box_insert_before(ed, rp, child, reference))
+   if ((!ed->file) || _edje_real_part_box_insert_before(ed, rp, child, 
reference))
      {
         Edje_User_Defined *eud;
 
@@ -4435,16 +4484,19 @@ Eina_Bool
 _edje_part_box_insert_after(Edje *ed, const char *part, Evas_Object *child, 
const Evas_Object *reference)
 {
    Eina_Bool ret;
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    ret = EINA_FALSE;
 
    if ((!ed) || (!part)) return ret;
 
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return ret;
-   if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return ret;
+        if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+     }
 
-   if (_edje_real_part_box_insert_after(ed, rp, child, reference))
+   if ((!ed->file) || _edje_real_part_box_insert_after(ed, rp, child, 
reference))
      {
         Edje_User_Defined *eud;
 
@@ -4463,16 +4515,19 @@ Eina_Bool
 _edje_part_box_insert_at(Edje *ed, const char *part, Evas_Object *child, 
unsigned int pos)
 {
    Eina_Bool ret;
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    ret = EINA_FALSE;
 
    if ((!ed) || (!part)) return ret;
 
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return ret;
-   if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return ret;
+        if (rp->part->type != EDJE_PART_TYPE_BOX) return ret;
+     }
 
-   if (_edje_real_part_box_insert_at(ed, rp, child, pos))
+   if ((!ed->file) || _edje_real_part_box_insert_at(ed, rp, child, pos))
      {
         Edje_User_Defined *eud;
 
@@ -4919,17 +4974,20 @@ Eina_Bool
 _edje_part_table_pack(Edje *ed, const char *part, Evas_Object *child_obj, 
unsigned short col, unsigned short row, unsigned short colspan, unsigned short 
rowspan)
 {
    Eina_Bool ret;
-   Edje_Real_Part *rp;
+   Edje_Real_Part *rp = NULL;
    Edje_User_Defined *eud;
    ret = EINA_FALSE;
 
    if ((!ed) || (!part)) return ret;
 
-   rp = _edje_real_part_recursive_get(&ed, part);
-   if (!rp) return ret;
-   if (rp->part->type != EDJE_PART_TYPE_TABLE) return ret;
+   if (ed->file)
+     {
+        rp = _edje_real_part_recursive_get(&ed, part);
+        if (!rp) return ret;
+        if (rp->part->type != EDJE_PART_TYPE_TABLE) return ret;
+     }
 
-   if (_edje_real_part_table_pack(ed, rp, child_obj, col, row, colspan, 
rowspan))
+   if ((!ed->file) || _edje_real_part_table_pack(ed, rp, child_obj, col, row, 
colspan, rowspan))
      {
         ret = EINA_TRUE;
         eud = _edje_user_definition_new(EDJE_USER_TABLE_PACK, part, ed);
diff --git a/src/tests/elementary/efl_ui_test_layout.c 
b/src/tests/elementary/efl_ui_test_layout.c
index 8f52408cc4..20581d4ae6 100644
--- a/src/tests/elementary/efl_ui_test_layout.c
+++ b/src/tests/elementary/efl_ui_test_layout.c
@@ -106,6 +106,22 @@ EFL_START_TEST(efl_ui_layout_test_layout_theme)
 }
 EFL_END_TEST
 
+EFL_START_TEST(efl_ui_layout_test_api_ordering)
+{
+   Evas_Object *win, *box;
+   const char text_text[] = "test text";
+
+   win = win_add(NULL, "layout", EFL_UI_WIN_TYPE_BASIC);
+   box = efl_add(EFL_UI_BOX_CLASS, win);
+   Eo *layout = efl_add(EFL_UI_BUTTON_CLASS, win,
+     efl_content_set(efl_added, box),
+     efl_text_set(efl_added, text_text)
+   );
+   ck_assert_ptr_eq(efl_content_get(layout), box);
+   ck_assert_str_eq(efl_text_get(layout), text_text);
+}
+EFL_END_TEST
+
 void efl_ui_test_layout(TCase *tc)
 {
    tcase_add_test(tc, efl_ui_layout_test_property_bind);
@@ -113,4 +129,5 @@ void efl_ui_test_layout(TCase *tc)
    tcase_add_test(tc, efl_ui_layout_test_layout_api_update_hints);
    tcase_add_test(tc, efl_ui_layout_test_layout_force);
    tcase_add_test(tc, efl_ui_layout_test_layout_theme);
+   tcase_add_test(tc, efl_ui_layout_test_api_ordering);
 }

-- 


Reply via email to