Elm: Reparent when swallowing an object.

Make the layout the parent on swallow, and the canvas the parent on
unswallow.
This commit is contained in:
Tom Hacohen 2016-04-07 14:50:32 +01:00
parent 4d0494574b
commit a73cdbdb46
1 changed files with 29 additions and 12 deletions

View File

@ -674,6 +674,15 @@ _elm_layout_part_aliasing_eval(const Evas_Object *obj EINA_UNUSED,
return EINA_TRUE;
}
static void
_eo_unparent_helper(Eo *child, Eo *parent)
{
if (eo_parent_get(child) == parent)
{
eo_parent_set(child, evas_common_evas_get(parent));
}
}
static void
_box_reference_del(void *data,
Evas *e EINA_UNUSED,
@ -701,6 +710,7 @@ _sub_box_remove(Evas_Object *obj,
edje_object_part_box_remove
(wd->resize_obj, sub_d->part, child);
_eo_unparent_helper(child, obj);
if (!elm_widget_sub_object_del(obj, child))
{
ERR("could not remove sub object %p from %p", child, obj);
@ -739,6 +749,8 @@ _sub_table_remove(Evas_Object *obj,
edje_object_part_table_unpack
(wd->resize_obj, sub_d->part, child);
_eo_unparent_helper(child, obj);
if (!elm_widget_sub_object_del(obj, child))
{
ERR("could not remove sub object %p from %p", child, obj);
@ -1001,6 +1013,7 @@ _elm_layout_elm_container_content_set(Eo *obj, Elm_Layout_Smart_Data *sd, const
if (!strcmp(part, sub_d->part))
{
if (content == sub_d->obj) goto end;
_eo_unparent_helper(sub_d->obj, obj);
evas_object_del(sub_d->obj);
break;
}
@ -1040,6 +1053,7 @@ _elm_layout_elm_container_content_set(Eo *obj, Elm_Layout_Smart_Data *sd, const
sub_d->obj = content;
sd->subs = eina_list_append(sd->subs, sub_d);
eo_parent_set(content, obj);
_icon_signal_emit(sd, sub_d, EINA_TRUE);
}
@ -1116,6 +1130,7 @@ _elm_layout_elm_container_content_unset(Eo *obj, Elm_Layout_Smart_Data *sd, cons
edje_object_part_unswallow
(wd->resize_obj, content);
_eo_unparent_helper(content, obj);
return content;
}
}
@ -1284,6 +1299,15 @@ _elm_layout_text_get(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part)
return edje_object_part_text_get(wd->resize_obj, part);
}
static void
_layout_box_subobj_init(Elm_Layout_Smart_Data *sd, Elm_Layout_Sub_Object_Data *sub_d, const char *part, Evas_Object *child)
{
sub_d->part = eina_stringshare_add(part);
sub_d->obj = child;
sd->subs = eina_list_append(sd->subs, sub_d);
eo_parent_set(child, sd->obj);
}
EOLIAN static Eina_Bool
_elm_layout_box_append(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child)
{
@ -1314,9 +1338,7 @@ _elm_layout_box_append(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Eva
return EINA_FALSE;
}
sub_d->type = BOX_APPEND;
sub_d->part = eina_stringshare_add(part);
sub_d->obj = child;
sd->subs = eina_list_append(sd->subs, sub_d);
_layout_box_subobj_init(sd, sub_d, part, child);
elm_obj_layout_sizing_eval(obj);
@ -1353,9 +1375,7 @@ _elm_layout_box_prepend(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Ev
return EINA_FALSE;
}
sub_d->type = BOX_PREPEND;
sub_d->part = eina_stringshare_add(part);
sub_d->obj = child;
sd->subs = eina_list_prepend(sd->subs, sub_d);
_layout_box_subobj_init(sd, sub_d, part, child);
elm_obj_layout_sizing_eval(obj);
@ -1393,10 +1413,8 @@ _elm_layout_box_insert_before(Eo *obj, Elm_Layout_Smart_Data *sd, const char *pa
return EINA_FALSE;
}
sub_d->type = BOX_INSERT_BEFORE;
sub_d->part = eina_stringshare_add(part);
sub_d->obj = child;
sub_d->p.box.reference = reference;
sd->subs = eina_list_append(sd->subs, sub_d);
_layout_box_subobj_init(sd, sub_d, part, child);
evas_object_event_callback_add
((Evas_Object *)reference, EVAS_CALLBACK_DEL, _box_reference_del, sub_d);
@ -1436,10 +1454,8 @@ _elm_layout_box_insert_at(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part,
return EINA_FALSE;
}
sub_d->type = BOX_INSERT_AT;
sub_d->part = eina_stringshare_add(part);
sub_d->obj = child;
sub_d->p.box.pos = pos;
sd->subs = eina_list_append(sd->subs, sub_d);
_layout_box_subobj_init(sd, sub_d, part, child);
elm_obj_layout_sizing_eval(obj);
@ -1537,6 +1553,7 @@ _elm_layout_table_pack(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Eva
sub_d->p.table.colspan = colspan;
sub_d->p.table.rowspan = rowspan;
sd->subs = eina_list_append(sd->subs, sub_d);
eo_parent_set(child, obj);
elm_obj_layout_sizing_eval(obj);