recursively hide edje group objects on edje hide

this massively improves edje performance when using groups, which previously would continue calculating their parts even when their parent object was hidden

CPU usage in my test case went from 20-30% to 1%.

@fix
This commit is contained in:
zmike 2014-05-22 13:39:14 -04:00
parent 0b33a142b1
commit 385326b8e4
3 changed files with 25 additions and 3 deletions

View File

@ -3915,7 +3915,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
eo_do(ep->typedata.swallow->swallowed_object,
evas_obj_position_set(ed->x + pf->final.x, ed->y + pf->final.y),
evas_obj_size_set(pf->final.w, pf->final.h),
evas_obj_visibility_set(EINA_TRUE));
evas_obj_visibility_set(evas_object_visible_get(ed->obj)));
}
else evas_object_hide(ep->typedata.swallow->swallowed_object);
mo = ep->typedata.swallow->swallowed_object;

View File

@ -899,7 +899,9 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
obj);
if (rp->part->type == EDJE_PART_TYPE_GROUP)
{
ed->groups = eina_list_append(ed->groups, _edje_fetch(child_obj));
Edje *edg = _edje_fetch(child_obj);
ed->groups = eina_list_append(ed->groups, edg);
evas_object_data_set(child_obj, "\377 edje.part_obj", rp);
_edje_real_part_swallow(ed, rp, child_obj, EINA_TRUE);
_edje_subobj_register(ed, child_obj);
source = NULL;
@ -1965,4 +1967,4 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *sig, const char *sou
if (ed_parent)
_edje_util_message_send(ed_parent, EDJE_QUEUE_SCRIPT,
EDJE_MESSAGE_SIGNAL, 0, &emsg);
}
}

View File

@ -272,6 +272,9 @@ _edje_evas_smart_resize(Eo *obj EINA_UNUSED, Edje *ed, Evas_Coord w, Evas_Coord
EOLIAN static void
_edje_evas_smart_show(Eo *obj, Edje *ed)
{
Eina_List *l;
Edje *edg;
eo_do_super(obj, MY_CLASS, evas_obj_smart_show());
if (evas_object_visible_get(obj)) return;
if (_edje_script_only(ed))
@ -284,12 +287,27 @@ _edje_evas_smart_show(Eo *obj, Edje *ed)
_edje_lua_script_only_show(ed);
return;
}
if (eina_list_count(ed->groups) > 1)
{
EINA_LIST_FOREACH(ed->groups, l, edg)
{
Edje_Real_Part *rp;
if (edg == ed) continue;
rp = evas_object_data_get(edg->obj, "\377 edje.part_obj");
if (rp->chosen_description->visible)
evas_object_show(edg->obj);
}
}
_edje_emit(ed, "show", NULL);
}
EOLIAN static void
_edje_evas_smart_hide(Eo *obj, Edje *ed)
{
Eina_List *l;
Edje *edg;
eo_do_super(obj, MY_CLASS, evas_obj_smart_hide());
if (!evas_object_visible_get(obj)) return;
if (_edje_script_only(ed))
@ -302,6 +320,8 @@ _edje_evas_smart_hide(Eo *obj, Edje *ed)
_edje_lua_script_only_hide(ed);
return;
}
EINA_LIST_FOREACH(ed->groups, l, edg)
if (edg != ed) evas_object_hide(edg->obj);
_edje_emit(ed, "hide", NULL);
}