Elm Layout: Make box & table part proxies temporary

efl_part returns short lived objects, let's make them
die after each function call.
This commit is contained in:
Jean-Philippe Andre 2016-05-26 14:06:52 +09:00
parent 58d0c89fd9
commit 6e487e93b8
5 changed files with 87 additions and 114 deletions

View File

@ -17,7 +17,6 @@ class Efl.Ui.Layout_Internal.Box (Eo.Base, Efl.Pack.Linear)
} }
} }
implements { implements {
Eo.Base.finalize;
Eo.Base.destructor; Eo.Base.destructor;
Efl.Container.content_iterate; Efl.Container.content_iterate;
Efl.Container.content_count; Efl.Container.content_count;

View File

@ -17,7 +17,6 @@ class Efl.Ui.Layout_Internal.Table (Eo.Base, Efl.Pack.Grid)
} }
} }
implements { implements {
Eo.Base.finalize;
Eo.Base.destructor; Eo.Base.destructor;
Efl.Container.content_iterate; Efl.Container.content_iterate;
Efl.Container.content_count; Efl.Container.content_count;

View File

@ -1993,45 +1993,24 @@ elm_layout_table_clear(Elm_Layout *obj, const char *part, Eina_Bool clear)
/* Efl.Part implementation */ /* Efl.Part implementation */
static EOLIAN void
_elm_layout_internal_part_eo_base_destructor(Eo *obj, Elm_Part_Data *pd)
{
free(pd->part);
eo_data_xunref(pd->obj, pd->sd, obj);
eo_destructor(eo_super(obj, ELM_LAYOUT_INTERNAL_PART_CLASS));
}
static EOLIAN Eo_Base * static EOLIAN Eo_Base *
_elm_layout_efl_part_part(const Eo *obj, Elm_Layout_Smart_Data *sd, _elm_layout_efl_part_part(const Eo *obj, Elm_Layout_Smart_Data *sd,
const char *part) const char *part)
{ {
Elm_Layout_Sub_Object_Data *sub_d;
const Evas_Object *subobj; const Evas_Object *subobj;
Elm_Part_Data *pd; Elm_Part_Data *pd;
Eina_List *l;
Eo *proxy; Eo *proxy;
if (!_elm_layout_part_aliasing_eval(obj, sd, &part, EINA_FALSE)) if (!_elm_layout_part_aliasing_eval(obj, sd, &part, EINA_FALSE))
return NULL; return NULL;
// Find parts which already have content
if (EINA_LIKELY(!!part))
{
EINA_LIST_FOREACH(sd->subs, l, sub_d)
{
if ((sub_d->type == TABLE_PACK) || _sub_box_is(sub_d))
{
if (!strcmp(part, sub_d->part))
return _elm_layout_pack_proxy_get((Eo *) obj, sub_d->obj, part);
}
}
}
// Ask edje for existing parts: BOX & TABLE
ELM_WIDGET_DATA_GET_OR_RETURN((Eo *) obj, wd, NULL); ELM_WIDGET_DATA_GET_OR_RETURN((Eo *) obj, wd, NULL);
// Ask edje for existing parts
subobj = edje_object_part_object_get(wd->resize_obj, part); subobj = edje_object_part_object_get(wd->resize_obj, part);
if (subobj) if (subobj)
{ {
// Support BOX & TABLE
proxy = _elm_layout_pack_proxy_get((Eo *) obj, (Eo *) subobj, part); proxy = _elm_layout_pack_proxy_get((Eo *) obj, (Eo *) subobj, part);
if (proxy) return proxy; if (proxy) return proxy;
} }
@ -2050,6 +2029,7 @@ _elm_layout_efl_part_part(const Eo *obj, Elm_Layout_Smart_Data *sd,
return proxy; return proxy;
} }
ELM_PART_IMPLEMENT_DESTRUCTOR(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data)
ELM_PART_IMPLEMENT_CONTENT_SET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data) ELM_PART_IMPLEMENT_CONTENT_SET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data)
ELM_PART_IMPLEMENT_CONTENT_GET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data) ELM_PART_IMPLEMENT_CONTENT_GET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data)
ELM_PART_IMPLEMENT_CONTENT_UNSET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data) ELM_PART_IMPLEMENT_CONTENT_UNSET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data)

View File

@ -10,14 +10,13 @@
#include "elm_priv.h" #include "elm_priv.h"
#include "elm_widget_layout.h" #include "elm_widget_layout.h"
#include "elm_part_helper.h"
#include "efl_ui_layout_internal_box.eo.h" #include "efl_ui_layout_internal_box.eo.h"
#include "efl_ui_layout_internal_table.eo.h" #include "efl_ui_layout_internal_table.eo.h"
#include "../evas/canvas/evas_box.eo.h" #include "../evas/canvas/evas_box.eo.h"
#include "../evas/canvas/evas_table.eo.h" #include "../evas/canvas/evas_table.eo.h"
#warning TODO: Implement proper lifecycle of proxy objects (single call)
/* layout internals for box & table */ /* layout internals for box & table */
Eina_Bool _elm_layout_box_append(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child); Eina_Bool _elm_layout_box_append(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child);
Eina_Bool _elm_layout_box_prepend(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child); Eina_Bool _elm_layout_box_prepend(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child);
@ -31,7 +30,6 @@ Eina_Bool _elm_layout_table_clear(Eo *obj, Elm_Layout_Smart_Data *sd, const c
#define BOX_CLASS EFL_UI_LAYOUT_INTERNAL_BOX_CLASS #define BOX_CLASS EFL_UI_LAYOUT_INTERNAL_BOX_CLASS
#define TABLE_CLASS EFL_UI_LAYOUT_INTERNAL_TABLE_CLASS #define TABLE_CLASS EFL_UI_LAYOUT_INTERNAL_TABLE_CLASS
#define DATA_KEY "__elm_layout_internal"
typedef struct _Layout_Part_Data Efl_Ui_Layout_Box_Data; typedef struct _Layout_Part_Data Efl_Ui_Layout_Box_Data;
typedef struct _Layout_Part_Data Efl_Ui_Layout_Table_Data; typedef struct _Layout_Part_Data Efl_Ui_Layout_Table_Data;
@ -39,10 +37,11 @@ typedef struct _Part_Item_Iterator Part_Item_Iterator;
struct _Layout_Part_Data struct _Layout_Part_Data
{ {
Elm_Layout *obj; Elm_Layout *obj; // no ref
Elm_Layout_Smart_Data *sd; Elm_Layout_Smart_Data *sd; // data xref
Eina_Stringshare *part; Eina_Stringshare *part;
Evas_Object *pack; Evas_Object *pack;
unsigned char temp;
}; };
struct _Part_Item_Iterator struct _Part_Item_Iterator
@ -58,9 +57,6 @@ _elm_layout_pack_proxy_get(Elm_Layout *obj, Evas_Object *pack, const char *part)
{ {
Efl_Ui_Layout_Internal_Box *eo; Efl_Ui_Layout_Internal_Box *eo;
eo = eo_key_obj_get(pack, DATA_KEY);
if (eo) return eo;
if (eo_isa(pack, EVAS_BOX_CLASS)) if (eo_isa(pack, EVAS_BOX_CLASS))
eo = eo_add(BOX_CLASS, obj, eo = eo_add(BOX_CLASS, obj,
efl_ui_layout_internal_box_real_part_set(eo_self, obj, pack, part)); efl_ui_layout_internal_box_real_part_set(eo_self, obj, pack, part));
@ -70,31 +66,26 @@ _elm_layout_pack_proxy_get(Elm_Layout *obj, Evas_Object *pack, const char *part)
else else
return NULL; return NULL;
eo_key_obj_set(pack, DATA_KEY, eo);
return eo; return eo;
} }
EOLIAN static void EOLIAN static void
_efl_ui_layout_internal_box_real_part_set(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Eo *layout, Eo *pack, const char *part) _efl_ui_layout_internal_box_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Table_Data *pd)
{ {
pd->obj = layout; ELM_PART_HOOK;
pd->sd = eo_data_scope_get(layout, ELM_LAYOUT_CLASS); eo_data_xunref(pd->obj, pd->sd, obj);
pd->part = part; eina_stringshare_del(pd->part);
pd->pack = pack; eo_destructor(eo_super(obj, BOX_CLASS));
}
EOLIAN static Eo_Base *
_efl_ui_layout_internal_box_eo_base_finalize(Eo *obj, Efl_Ui_Layout_Box_Data *pd)
{
EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->obj && pd->part && pd->sd, NULL);
return eo_finalize(eo_super(obj, BOX_CLASS));
} }
EOLIAN static void EOLIAN static void
_efl_ui_layout_internal_box_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Box_Data *pd) _efl_ui_layout_internal_box_real_part_set(Eo *obj, Efl_Ui_Layout_Box_Data *pd, Eo *layout, Eo *pack, const char *part)
{ {
eo_key_data_set(pd->pack, DATA_KEY, NULL); pd->obj = layout;
eo_destructor(eo_super(obj, BOX_CLASS)); pd->sd = eo_data_xref(pd->obj, ELM_LAYOUT_CLASS, obj);
eina_stringshare_replace(&pd->part, part);
pd->pack = pack;
pd->temp = 1;
} }
/* this iterator is the same as efl_ui_box */ /* this iterator is the same as efl_ui_box */
@ -153,62 +144,62 @@ _efl_ui_layout_internal_box_efl_container_content_iterate(Eo *obj, Efl_Ui_Layout
Eina_Iterator *it; Eina_Iterator *it;
it = evas_object_box_iterator_new(pd->pack); it = evas_object_box_iterator_new(pd->pack);
return _part_item_iterator_create(obj, it, NULL); ELM_PART_RETURN_VAL(_part_item_iterator_create(obj, it, NULL));
} }
EOLIAN static int EOLIAN static int
_efl_ui_layout_internal_box_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd) _efl_ui_layout_internal_box_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
{ {
return evas_obj_box_count(pd->pack); ELM_PART_RETURN_VAL(evas_obj_box_count(pd->pack));
}
EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Box_Data *pd EINA_UNUSED, Efl_Gfx *content)
{
// alias
return efl_pack_unpack(obj, content);
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd) _efl_ui_layout_internal_box_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
{ {
return _elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_TRUE); ELM_PART_RETURN_VAL(_elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_TRUE));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd) _efl_ui_layout_internal_box_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
{ {
return _elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_FALSE); ELM_PART_RETURN_VAL(_elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_FALSE));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) _efl_ui_layout_internal_box_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
{ {
return _elm_layout_box_remove(pd->obj, pd->sd, pd->part, subobj) != NULL; ELM_PART_RETURN_VAL(_elm_layout_box_remove(pd->obj, pd->sd, pd->part, subobj) != NULL);
}
EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *content)
{
// alias for efl_pack_unpack
return _efl_ui_layout_internal_box_efl_pack_unpack(obj, pd, content);
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_pack_pack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) _efl_ui_layout_internal_box_efl_pack_pack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
{ {
return _elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj); ELM_PART_RETURN_VAL(_elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_pack_linear_pack_begin(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) _efl_ui_layout_internal_box_efl_pack_linear_pack_begin(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
{ {
return _elm_layout_box_prepend(pd->obj, pd->sd, pd->part, subobj); ELM_PART_RETURN_VAL(_elm_layout_box_prepend(pd->obj, pd->sd, pd->part, subobj));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_pack_linear_pack_end(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj) _efl_ui_layout_internal_box_efl_pack_linear_pack_end(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
{ {
return _elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj); ELM_PART_RETURN_VAL(_elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_pack_linear_pack_before(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj, const Efl_Gfx *existing) _efl_ui_layout_internal_box_efl_pack_linear_pack_before(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj, const Efl_Gfx *existing)
{ {
return _elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, existing); ELM_PART_RETURN_VAL(_elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, existing));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
@ -218,20 +209,20 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_after(Eo *obj EINA_UNUSED, Efl_
int index; int index;
index = efl_pack_index_get(pd->pack, existing); index = efl_pack_index_get(pd->pack, existing);
if (index < 0) return EINA_FALSE; if (index < 0) ELM_PART_RETURN_VAL(EINA_FALSE);
other = efl_pack_content_get(pd->pack, index + 1); other = efl_pack_content_get(pd->pack, index + 1);
if (other) if (other)
return _elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, other); ELM_PART_RETURN_VAL(_elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, other));
efl_pack_end(obj, subobj); ELM_PART_CALL(efl_pack_end(obj, subobj));
return EINA_TRUE; ELM_PART_RETURN_VAL(EINA_TRUE);
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_box_efl_pack_linear_pack_at(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj, int index) _efl_ui_layout_internal_box_efl_pack_linear_pack_at(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj, int index)
{ {
return _elm_layout_box_insert_at(pd->obj, pd->sd, pd->part, subobj, index); ELM_PART_RETURN_VAL(_elm_layout_box_insert_at(pd->obj, pd->sd, pd->part, subobj, index));
} }
EOLIAN static Efl_Gfx * EOLIAN static Efl_Gfx *
@ -242,8 +233,8 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_content_get(Eo *obj EINA_UNUSED
priv = eo_data_scope_get(pd->pack, EVAS_BOX_CLASS); priv = eo_data_scope_get(pd->pack, EVAS_BOX_CLASS);
opt = eina_list_nth(priv->children, index); opt = eina_list_nth(priv->children, index);
if (!opt) return NULL; if (!opt) ELM_PART_RETURN_VAL(NULL);
return opt->obj; ELM_PART_RETURN_VAL(opt->obj);
} }
EOLIAN static Efl_Gfx * EOLIAN static Efl_Gfx *
@ -252,18 +243,18 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Layou
Efl_Gfx *subobj; Efl_Gfx *subobj;
subobj = efl_pack_content_get(pd->pack, index); subobj = efl_pack_content_get(pd->pack, index);
if (!subobj) return NULL; if (!subobj) ELM_PART_RETURN_VAL(NULL);
if (efl_pack_unpack(obj, subobj)) if (efl_pack_unpack(obj, subobj))
return subobj; ELM_PART_RETURN_VAL(subobj);
ERR("failed to remove %p from %p (item %d)", subobj, pd->obj, index); ERR("failed to remove %p from %p (item %d)", subobj, pd->obj, index);
return NULL; ELM_PART_RETURN_VAL(NULL);
} }
EOLIAN static int EOLIAN static int
_efl_ui_layout_internal_box_efl_pack_linear_pack_index_get(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, const Efl_Gfx *subobj) _efl_ui_layout_internal_box_efl_pack_linear_pack_index_get(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, const Efl_Gfx *subobj)
{ {
return efl_pack_index_get(pd->pack, subobj); ELM_PART_RETURN_VAL(efl_pack_index_get(pd->pack, subobj));
} }
EOLIAN static Efl_Orient EOLIAN static Efl_Orient
@ -271,29 +262,27 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_direction_get(Eo *obj EINA_UNUS
{ {
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_ORIENT_NONE); ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_ORIENT_NONE);
return efl_pack_direction_get(efl_content_get(efl_part(wd->resize_obj, pd->part))); ELM_PART_RETURN_VAL(efl_pack_direction_get(efl_part(wd->resize_obj, pd->part)));
} }
/* Table proxy implementation */
EOLIAN static void EOLIAN static void
_efl_ui_layout_internal_table_real_part_set(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Eo *layout, Eo *pack, const char *part) _efl_ui_layout_internal_table_real_part_set(Eo *obj, Efl_Ui_Layout_Table_Data *pd, Eo *layout, Eo *pack, const char *part)
{ {
pd->obj = layout; pd->obj = layout;
pd->sd = eo_data_scope_get(layout, ELM_LAYOUT_CLASS); pd->sd = eo_data_xref(pd->obj, ELM_LAYOUT_CLASS, obj);
pd->part = eina_stringshare_add(part); eina_stringshare_replace(&pd->part, part);
pd->pack = pack; pd->pack = pack;
} pd->temp = 1;
EOLIAN static Eo_Base *
_efl_ui_layout_internal_table_eo_base_finalize(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
{
EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->obj && pd->part && pd->sd, NULL);
return eo_finalize(eo_super(obj, TABLE_CLASS));
} }
EOLIAN static void EOLIAN static void
_efl_ui_layout_internal_table_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Box_Data *pd) _efl_ui_layout_internal_table_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Table_Data *pd)
{ {
eo_key_data_set(pd->pack, DATA_KEY, NULL); ELM_PART_HOOK;
eo_data_xunref(pd->obj, pd->sd, obj);
eina_stringshare_del(pd->part); eina_stringshare_del(pd->part);
eo_destructor(eo_super(obj, TABLE_CLASS)); eo_destructor(eo_super(obj, TABLE_CLASS));
} }
@ -305,50 +294,51 @@ _efl_ui_layout_internal_table_efl_container_content_iterate(Eo *obj, Efl_Ui_Layo
it = evas_object_table_iterator_new(pd->pack); it = evas_object_table_iterator_new(pd->pack);
return _part_item_iterator_create(obj, it, NULL); ELM_PART_RETURN_VAL(_part_item_iterator_create(obj, it, NULL));
} }
EOLIAN static int EOLIAN static int
_efl_ui_layout_internal_table_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) _efl_ui_layout_internal_table_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
{ {
return evas_obj_table_count(pd->pack); ELM_PART_RETURN_VAL(evas_obj_table_count(pd->pack));
}
EOLIAN static Eina_Bool
_efl_ui_layout_internal_table_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Table_Data *pd EINA_UNUSED, Efl_Gfx *content)
{
return efl_pack_unpack(obj, content);
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_table_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) _efl_ui_layout_internal_table_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
{ {
return _elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_TRUE); ELM_PART_RETURN_VAL(_elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_TRUE));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_table_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd) _efl_ui_layout_internal_table_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
{ {
return _elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_FALSE); ELM_PART_RETURN_VAL(_elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_FALSE));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_table_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj) _efl_ui_layout_internal_table_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj)
{ {
if (!subobj) return EINA_FALSE; if (!subobj) ELM_PART_RETURN_VAL(EINA_FALSE);
return _elm_layout_table_unpack(pd->obj, pd->sd, pd->part, subobj) == subobj; ELM_PART_RETURN_VAL(_elm_layout_table_unpack(pd->obj, pd->sd, pd->part, subobj) == subobj);
}
EOLIAN static Eina_Bool
_efl_ui_layout_internal_table_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *content)
{
// alias for efl_pack_unpack
return _efl_ui_layout_internal_table_efl_pack_unpack(obj, pd, content);
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
_efl_ui_layout_internal_table_efl_pack_grid_pack_grid(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj, int col, int row, int colspan, int rowspan) _efl_ui_layout_internal_table_efl_pack_grid_pack_grid(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj, int col, int row, int colspan, int rowspan)
{ {
return _elm_layout_table_pack(pd->obj, pd->sd, pd->part, subobj, col, row, colspan, rowspan); ELM_PART_RETURN_VAL(_elm_layout_table_pack(pd->obj, pd->sd, pd->part, subobj, col, row, colspan, rowspan));
} }
EOLIAN static Efl_Gfx * EOLIAN static Efl_Gfx *
_efl_ui_layout_internal_table_efl_pack_grid_grid_content_get(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, int col, int row) _efl_ui_layout_internal_table_efl_pack_grid_grid_content_get(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, int col, int row)
{ {
return evas_object_table_child_get(pd->pack, col, row); ELM_PART_RETURN_VAL(evas_object_table_child_get(pd->pack, col, row));
} }
EOLIAN static Eina_Iterator * EOLIAN static Eina_Iterator *
@ -376,7 +366,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_contents_get(Eo *obj EINA_UNUSE
} }
} }
return _part_item_iterator_create(pd->obj, eina_list_iterator_new(l), l); ELM_PART_RETURN_VAL(_part_item_iterator_create(pd->obj, eina_list_iterator_new(l), l));
} }
EOLIAN static Eina_Bool EOLIAN static Eina_Bool
@ -391,7 +381,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_position_get(Eo *obj EINA_UNUSE
if (colspan) *colspan = cs; if (colspan) *colspan = cs;
if (rowspan) *rowspan = rs; if (rowspan) *rowspan = rs;
return ret; ELM_PART_RETURN_VAL(ret);
} }
EOLIAN static void EOLIAN static void
@ -405,7 +395,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_columns_get(Eo *obj EINA_UNUSED
{ {
int cols, rows; int cols, rows;
evas_object_table_col_row_size_get(pd->pack, &cols, &rows); evas_object_table_col_row_size_get(pd->pack, &cols, &rows);
return cols; ELM_PART_RETURN_VAL(cols);
} }
EOLIAN static int EOLIAN static int
@ -413,7 +403,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_rows_get(Eo *obj EINA_UNUSED, E
{ {
int cols, rows; int cols, rows;
evas_object_table_col_row_size_get(pd->pack, &cols, &rows); evas_object_table_col_row_size_get(pd->pack, &cols, &rows);
return rows; ELM_PART_RETURN_VAL(rows);
} }
#include "efl_ui_layout_internal_box.eo.c" #include "efl_ui_layout_internal_box.eo.c"

View File

@ -3,10 +3,13 @@
#include "elm_layout_internal_part.eo.h" #include "elm_layout_internal_part.eo.h"
//#define ELM_PART_HOOK do { ERR("%p:%s [%d]", pd->obj, pd->part, (int) pd->temp); } while(0)
#define ELM_PART_HOOK
#define ELM_PART_REF(obj, pd) do { if (!(pd->temp++)) eo_ref(obj); } while(0) #define ELM_PART_REF(obj, pd) do { if (!(pd->temp++)) eo_ref(obj); } while(0)
#define ELM_PART_UNREF(obj, pd) do { if (pd->temp) { if (!(--pd->temp)) eo_unref(obj); } } while(0) #define ELM_PART_UNREF(obj, pd) do { if (pd->temp) { if (!(--pd->temp)) eo_unref(obj); } } while(0)
#define ELM_PART_RETURN_VAL(a) do { typeof(a) _ret = a; ELM_PART_UNREF(obj, pd); return _ret; } while(0) #define ELM_PART_RETURN_VAL(a) do { ELM_PART_HOOK; typeof(a) _ret = a; ELM_PART_UNREF(obj, pd); return _ret; } while(0)
#define ELM_PART_RETURN_VOID do { ELM_PART_UNREF(obj, pd); return; } while(0) #define ELM_PART_RETURN_VOID do { ELM_PART_HOOK; ELM_PART_UNREF(obj, pd); return; } while(0)
#define ELM_PART_CALL(a) ({ ELM_PART_REF(obj, pd); a; }) #define ELM_PART_CALL(a) ({ ELM_PART_REF(obj, pd); a; })
typedef struct _Elm_Part_Data Elm_Part_Data; typedef struct _Elm_Part_Data Elm_Part_Data;
@ -21,17 +24,19 @@ struct _Elm_Part_Data
// Note: this generic implementation can be improved to support part object // Note: this generic implementation can be improved to support part object
// caching or something... // caching or something...
// Main part proxy implementation #define ELM_PART_IMPLEMENT_DESTRUCTOR(type, TYPE, typedata, partdata) \
#define ELM_PART_IMPLEMENT(type, TYPE, typedata, partdata) \
\
static EOLIAN void \ static EOLIAN void \
_ ## type ## _internal_part_eo_base_destructor(Eo *obj, partdata *pd) \ _ ## type ## _internal_part_eo_base_destructor(Eo *obj, partdata *pd) \
{ \ { \
ELM_PART_HOOK; \
free(pd->part); \ free(pd->part); \
eo_data_xunref(pd->obj, pd->sd, obj); \ eo_data_xunref(pd->obj, pd->sd, obj); \
eo_destructor(eo_super(obj, TYPE ## _INTERNAL_PART_CLASS)); \ eo_destructor(eo_super(obj, TYPE ## _INTERNAL_PART_CLASS)); \
} \ } \
\
// Main part proxy implementation
#define ELM_PART_IMPLEMENT(type, TYPE, typedata, partdata) \
ELM_PART_IMPLEMENT_DESTRUCTOR(type, TYPE, typedata, partdata) \
static EOLIAN Eo_Base * \ static EOLIAN Eo_Base * \
_ ## type ## _efl_part_part(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \ _ ## type ## _efl_part_part(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \
{ \ { \