#include "elm_priv.h"
#include "elm_widget_layout.h"
+#include "elm_part_helper.h"
#include "efl_ui_layout_internal_box.eo.h"
#include "efl_ui_layout_internal_table.eo.h"
#include "../evas/canvas/evas_box.eo.h"
#include "../evas/canvas/evas_table.eo.h"
-#warning TODO: Implement proper lifecycle of proxy objects (single call)
-
/* 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_prepend(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child);
#define BOX_CLASS EFL_UI_LAYOUT_INTERNAL_BOX_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_Table_Data;
struct _Layout_Part_Data
{
- Elm_Layout *obj;
- Elm_Layout_Smart_Data *sd;
+ Elm_Layout *obj; // no ref
+ Elm_Layout_Smart_Data *sd; // data xref
Eina_Stringshare *part;
Evas_Object *pack;
+ unsigned char temp;
};
struct _Part_Item_Iterator
{
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))
eo = eo_add(BOX_CLASS, obj,
efl_ui_layout_internal_box_real_part_set(eo_self, obj, pack, part));
else
return NULL;
- eo_key_obj_set(pack, DATA_KEY, eo);
return eo;
}
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)
-{
- pd->obj = layout;
- pd->sd = eo_data_scope_get(layout, ELM_LAYOUT_CLASS);
- pd->part = part;
- pd->pack = pack;
-}
-
-EOLIAN static Eo_Base *
-_efl_ui_layout_internal_box_eo_base_finalize(Eo *obj, Efl_Ui_Layout_Box_Data *pd)
+_efl_ui_layout_internal_box_eo_base_destructor(Eo *obj, 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, BOX_CLASS));
+ ELM_PART_HOOK;
+ eo_data_xunref(pd->obj, pd->sd, obj);
+ eina_stringshare_del(pd->part);
+ eo_destructor(eo_super(obj, BOX_CLASS));
}
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);
- eo_destructor(eo_super(obj, BOX_CLASS));
+ pd->obj = layout;
+ 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 */
Eina_Iterator *it;
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
_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)
+_efl_ui_layout_internal_box_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
{
- // alias
- return efl_pack_unpack(obj, content);
+ ELM_PART_RETURN_VAL(_elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_TRUE));
}
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_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_TRUE);
+ ELM_PART_RETURN_VAL(_elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_FALSE));
}
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(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
{
- return _elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_FALSE);
+ 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_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
+_efl_ui_layout_internal_box_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *content)
{
- return _elm_layout_box_remove(pd->obj, pd->sd, pd->part, subobj) != NULL;
+ // alias for efl_pack_unpack
+ return _efl_ui_layout_internal_box_efl_pack_unpack(obj, pd, content);
}
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)
{
- 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
_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
_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
_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
int index;
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);
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);
- return EINA_TRUE;
+ ELM_PART_CALL(efl_pack_end(obj, subobj));
+ ELM_PART_RETURN_VAL(EINA_TRUE);
}
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)
{
- 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 *
priv = eo_data_scope_get(pd->pack, EVAS_BOX_CLASS);
opt = eina_list_nth(priv->children, index);
- if (!opt) return NULL;
- return opt->obj;
+ if (!opt) ELM_PART_RETURN_VAL(NULL);
+ ELM_PART_RETURN_VAL(opt->obj);
}
EOLIAN static Efl_Gfx *
Efl_Gfx *subobj;
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))
- return subobj;
+ ELM_PART_RETURN_VAL(subobj);
ERR("failed to remove %p from %p (item %d)", subobj, pd->obj, index);
- return NULL;
+ ELM_PART_RETURN_VAL(NULL);
}
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)
{
- return efl_pack_index_get(pd->pack, subobj);
+ ELM_PART_RETURN_VAL(efl_pack_index_get(pd->pack, subobj));
}
EOLIAN static Efl_Orient
{
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
-_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->sd = eo_data_scope_get(layout, ELM_LAYOUT_CLASS);
- pd->part = eina_stringshare_add(part);
+ pd->sd = eo_data_xref(pd->obj, ELM_LAYOUT_CLASS, obj);
+ eina_stringshare_replace(&pd->part, part);
pd->pack = pack;
-}
-
-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));
+ pd->temp = 1;
}
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);
eo_destructor(eo_super(obj, TABLE_CLASS));
}
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
_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)
+_efl_ui_layout_internal_table_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
{
- return efl_pack_unpack(obj, content);
+ ELM_PART_RETURN_VAL(_elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_TRUE));
}
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_unpack_all(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_FALSE));
}
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(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj)
{
- return _elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_FALSE);
+ if (!subobj) ELM_PART_RETURN_VAL(EINA_FALSE);
+ 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_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj)
+_efl_ui_layout_internal_table_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *content)
{
- if (!subobj) return EINA_FALSE;
- return _elm_layout_table_unpack(pd->obj, pd->sd, pd->part, subobj) == subobj;
+ // alias for efl_pack_unpack
+ return _efl_ui_layout_internal_table_efl_pack_unpack(obj, pd, content);
}
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)
{
- 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 *
_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 *
}
}
- 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
if (colspan) *colspan = cs;
if (rowspan) *rowspan = rs;
- return ret;
+ ELM_PART_RETURN_VAL(ret);
}
EOLIAN static void
{
int cols, rows;
evas_object_table_col_row_size_get(pd->pack, &cols, &rows);
- return cols;
+ ELM_PART_RETURN_VAL(cols);
}
EOLIAN static int
{
int 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"