From f5d3f575c6b77e882ec26f9910276cf9ab1c299d Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 10 Jul 2019 14:24:53 -0400 Subject: [PATCH] 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); }