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
This commit is contained in:
Mike Blumenkrantz 2019-07-10 14:24:53 -04:00
parent 66213df2f5
commit f5d3f575c6
3 changed files with 132 additions and 52 deletions

View File

@ -779,6 +779,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
int group_path_started = 0; int group_path_started = 0;
Evas_Object *nested_smart = NULL; Evas_Object *nested_smart = NULL;
char lang[PATH_MAX]; char lang[PATH_MAX];
Eina_Bool had_file;
Eina_Hash *part_match = NULL; Eina_Hash *part_match = NULL;
/* Get data pointer of top-of-stack */ /* 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; return 0;
} }
had_file = !!ed->file;
tev = evas_object_evas_get(obj); tev = evas_object_evas_get(obj);
evas_event_freeze(tev); evas_event_freeze(tev);
@ -1696,6 +1698,9 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
break; break;
} }
eina_stringshare_del(eud->u.string.text); 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; break;
case EDJE_USER_TEXT_STYLE: case EDJE_USER_TEXT_STYLE:

View File

@ -2103,6 +2103,12 @@ _edje_efl_text_text_set(Eo *obj, Edje *ed, const char *part, const char *text,
Eina_Bool int_ret; Eina_Bool int_ret;
if ((!ed) || (!part)) return EINA_FALSE; 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); rp = _edje_real_part_recursive_get(&ed, part);
if (!rp) return EINA_FALSE; if (!rp) return EINA_FALSE;
if ((rp->part->type != EDJE_PART_TYPE_TEXT) && 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) if (!rp)
{ {
DBG("cannot swallow part %s: part not exist!", part); 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 Eina_Bool
_edje_object_part_drag_value_set(Edje *ed, const char *part, double dx, double dy) _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; Edje_User_Defined *eud;
Eina_List *l, *ll; Eina_List *l, *ll;
if ((!ed) || (!part)) return EINA_FALSE; if ((!ed) || (!part)) return EINA_FALSE;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return EINA_FALSE; {
if (!rp->drag) return EINA_FALSE; 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); l = eina_hash_find(ed->user_defined, part);
EINA_LIST_FOREACH(l, ll, eud) 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; eud->u.drag_position.y = dy;
} }
} }
if (!ed->file) return EINA_TRUE;
if (rp->part->dragable.confine_id != -1) 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 Eina_Bool
_edje_object_part_drag_size_set(Edje *ed, const char *part, double dw, double dh) _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; Edje_User_Defined *eud;
Eina_List *l, *ll; Eina_List *l, *ll;
if ((!ed) || (!part)) return EINA_FALSE; if ((!ed) || (!part)) return EINA_FALSE;
rp = _edje_real_part_recursive_get(&ed, part); rp = _edje_real_part_recursive_get(&ed, part);
if (!rp) return EINA_FALSE; if (ed->file)
if (!rp->drag) return EINA_FALSE; {
if (!rp) return EINA_FALSE;
if (!rp->drag) return EINA_FALSE;
}
l = eina_hash_find(ed->user_defined, part); l = eina_hash_find(ed->user_defined, part);
EINA_LIST_FOREACH(l, ll, eud) 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; eud->u.drag_size.h = dh;
} }
} }
if (!ed->file) return EINA_TRUE;
if (dw < 0.0) dw = 0.0; if (dw < 0.0) dw = 0.0;
else if (dw > 1.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 Eina_Bool
_edje_object_part_drag_step_set(Edje *ed, const char *part, double dx, double dy) _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; Edje_User_Defined *eud;
Eina_List *l, *ll; Eina_List *l, *ll;
if ((!ed) || (!part)) return EINA_FALSE; if ((!ed) || (!part)) return EINA_FALSE;
rp = _edje_real_part_recursive_get(&ed, part); rp = _edje_real_part_recursive_get(&ed, part);
if (!rp) return EINA_FALSE; if (ed->file)
if (!rp->drag) return EINA_FALSE; {
if (!rp) return EINA_FALSE;
if (!rp->drag) return EINA_FALSE;
}
l = eina_hash_find(ed->user_defined, part); l = eina_hash_find(ed->user_defined, part);
EINA_LIST_FOREACH(l, ll, eud) 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; eud->u.drag_position.y = dy;
} }
} }
if (!ed->file) return EINA_TRUE;
if (dx < 0.0) dx = 0.0; if (dx < 0.0) dx = 0.0;
else if (dx > 1.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 Eina_Bool
_edje_object_part_drag_page_set(Edje *ed, const char *part, double dx, double dy) _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; Edje_User_Defined *eud;
Eina_List *l, *ll; Eina_List *l, *ll;
if ((!ed) || (!part)) return EINA_FALSE; if ((!ed) || (!part)) return EINA_FALSE;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return EINA_FALSE; {
if (!rp->drag) return EINA_FALSE; 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); l = eina_hash_find(ed->user_defined, part);
EINA_LIST_FOREACH(l, ll, eud) 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; eud->u.drag_position.y = dy;
} }
} }
if (!ed->file) return EINA_TRUE;
if (dx < 0.0) dx = 0.0; if (dx < 0.0) dx = 0.0;
else if (dx > 1.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 Eina_Bool
_edje_object_part_drag_step(Edje *ed, const char *part, double dx, double dy) _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; FLOAT_T px, py;
Edje_User_Defined *eud; Edje_User_Defined *eud;
Eina_List *l, *ll; Eina_List *l, *ll;
if ((!ed) || (!part)) return EINA_FALSE; if ((!ed) || (!part)) return EINA_FALSE;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return EINA_FALSE; {
if (!rp->drag) return EINA_FALSE; 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); l = eina_hash_find(ed->user_defined, part);
EINA_LIST_FOREACH(l, ll, eud) 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; eud->u.drag_position.y = dy;
} }
} }
if (!ed->file) return EINA_TRUE;
px = rp->drag->val.x; px = rp->drag->val.x;
py = rp->drag->val.y; 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 Eina_Bool
_edje_object_part_drag_page(Edje *ed, const char *part, double dx, double dy) _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; FLOAT_T px, py;
Edje_User_Defined *eud; Edje_User_Defined *eud;
Eina_List *l, *ll; Eina_List *l, *ll;
if ((!ed) || (!part)) return EINA_FALSE; if ((!ed) || (!part)) return EINA_FALSE;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return EINA_FALSE; {
if (!rp->drag) return EINA_FALSE; 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); l = eina_hash_find(ed->user_defined, part);
EINA_LIST_FOREACH(l, ll, eud) 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; eud->u.drag_position.y = dy;
} }
} }
if (!ed->file) return EINA_TRUE;
px = rp->drag->val.x; px = rp->drag->val.x;
py = rp->drag->val.y; py = rp->drag->val.y;
@ -4350,16 +4390,19 @@ Eina_Bool
_edje_part_box_append(Edje *ed, const char *part, Evas_Object *child) _edje_part_box_append(Edje *ed, const char *part, Evas_Object *child)
{ {
Eina_Bool ret; Eina_Bool ret;
Edje_Real_Part *rp; Edje_Real_Part *rp = NULL;
ret = EINA_FALSE; ret = EINA_FALSE;
if ((!ed) || (!part) || (!child)) return ret; if ((!ed) || (!part) || (!child)) return ret;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return ret; {
if (rp->part->type != EDJE_PART_TYPE_BOX) 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 (_edje_real_part_box_append(ed, rp, child)) if ((!ed->file) || _edje_real_part_box_append(ed, rp, child))
{ {
Edje_User_Defined *eud; Edje_User_Defined *eud;
@ -4379,16 +4422,19 @@ Eina_Bool
_edje_part_box_prepend(Edje *ed, const char *part, Evas_Object *child) _edje_part_box_prepend(Edje *ed, const char *part, Evas_Object *child)
{ {
Eina_Bool ret; Eina_Bool ret;
Edje_Real_Part *rp; Edje_Real_Part *rp = NULL;
ret = EINA_FALSE; ret = EINA_FALSE;
if ((!ed) || (!part)) return ret; if ((!ed) || (!part)) return ret;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return ret; {
if (rp->part->type != EDJE_PART_TYPE_BOX) 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 (_edje_real_part_box_prepend(ed, rp, child)) if ((!ed->file) || _edje_real_part_box_prepend(ed, rp, child))
{ {
Edje_User_Defined *eud; 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) _edje_part_box_insert_before(Edje *ed, const char *part, Evas_Object *child, const Evas_Object *reference)
{ {
Eina_Bool ret; Eina_Bool ret;
Edje_Real_Part *rp; Edje_Real_Part *rp = NULL;
ret = EINA_FALSE; ret = EINA_FALSE;
if ((!ed) || (!part)) return ret; if ((!ed) || (!part)) return ret;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return ret; {
if (rp->part->type != EDJE_PART_TYPE_BOX) 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 (_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; 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) _edje_part_box_insert_after(Edje *ed, const char *part, Evas_Object *child, const Evas_Object *reference)
{ {
Eina_Bool ret; Eina_Bool ret;
Edje_Real_Part *rp; Edje_Real_Part *rp = NULL;
ret = EINA_FALSE; ret = EINA_FALSE;
if ((!ed) || (!part)) return ret; if ((!ed) || (!part)) return ret;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return ret; {
if (rp->part->type != EDJE_PART_TYPE_BOX) 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 (_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; 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) _edje_part_box_insert_at(Edje *ed, const char *part, Evas_Object *child, unsigned int pos)
{ {
Eina_Bool ret; Eina_Bool ret;
Edje_Real_Part *rp; Edje_Real_Part *rp = NULL;
ret = EINA_FALSE; ret = EINA_FALSE;
if ((!ed) || (!part)) return ret; if ((!ed) || (!part)) return ret;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return ret; {
if (rp->part->type != EDJE_PART_TYPE_BOX) 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 (_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; 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) _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; Eina_Bool ret;
Edje_Real_Part *rp; Edje_Real_Part *rp = NULL;
Edje_User_Defined *eud; Edje_User_Defined *eud;
ret = EINA_FALSE; ret = EINA_FALSE;
if ((!ed) || (!part)) return ret; if ((!ed) || (!part)) return ret;
rp = _edje_real_part_recursive_get(&ed, part); if (ed->file)
if (!rp) return ret; {
if (rp->part->type != EDJE_PART_TYPE_TABLE) 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 (_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; ret = EINA_TRUE;
eud = _edje_user_definition_new(EDJE_USER_TABLE_PACK, part, ed); eud = _edje_user_definition_new(EDJE_USER_TABLE_PACK, part, ed);

View File

@ -106,6 +106,22 @@ EFL_START_TEST(efl_ui_layout_test_layout_theme)
} }
EFL_END_TEST 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) void efl_ui_test_layout(TCase *tc)
{ {
tcase_add_test(tc, efl_ui_layout_test_property_bind); 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_api_update_hints);
tcase_add_test(tc, efl_ui_layout_test_layout_force); 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_layout_theme);
tcase_add_test(tc, efl_ui_layout_test_api_ordering);
} }