forked from enlightenment/efl
ui.relative_layout: implement Efl.Pack
Now, efl_content_iterate, efl_content_count, efl_pack, efl_pack_unpack, efl_pack_unpack_all and efl_pack_clear are available for relative_layout. Reviewed-by: Xavi Artigas <xavierartigas@yahoo.es> Differential Revision: https://phab.enlightenment.org/D8631
This commit is contained in:
parent
aaeff3f7b7
commit
2426656fd6
|
@ -27,29 +27,25 @@ _chain_sort_cb(const void *l1, const void *l2)
|
||||||
static void
|
static void
|
||||||
_on_child_size_changed(void *data, const Efl_Event *event EINA_UNUSED)
|
_on_child_size_changed(void *data, const Efl_Event *event EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Efl_Ui_Relative_Layout_Data *pd = data;
|
Efl_Ui_Relative_Layout *obj = data;
|
||||||
|
|
||||||
efl_pack_layout_request(pd->obj);
|
efl_pack_layout_request(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_on_child_hints_changed(void *data, const Efl_Event *event EINA_UNUSED)
|
_on_child_hints_changed(void *data, const Efl_Event *event EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Efl_Ui_Relative_Layout_Data *pd = data;
|
Efl_Ui_Relative_Layout *obj = data;
|
||||||
|
|
||||||
efl_pack_layout_request(pd->obj);
|
efl_pack_layout_request(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_on_child_del(void *data, const Efl_Event *event)
|
_on_child_del(void *data, const Efl_Event *event)
|
||||||
{
|
{
|
||||||
Efl_Ui_Relative_Layout_Data *pd = data;
|
Efl_Ui_Relative_Layout *obj = data;
|
||||||
|
|
||||||
if (eina_hash_del_by_key(pd->children, &event->object))
|
efl_pack_unpack(obj, event->object);
|
||||||
efl_pack_layout_request(pd->obj);
|
|
||||||
else
|
|
||||||
ERR("child(%p(%s)) is not registered", event->object,
|
|
||||||
efl_class_name_get(event->object));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EFL_CALLBACKS_ARRAY_DEFINE(efl_ui_relative_layout_callbacks,
|
EFL_CALLBACKS_ARRAY_DEFINE(efl_ui_relative_layout_callbacks,
|
||||||
|
@ -82,7 +78,7 @@ _efl_ui_relative_layout_register(Efl_Ui_Relative_Layout_Data *pd, Eo *child)
|
||||||
|
|
||||||
efl_key_data_set(child, "_elm_leaveme", pd->obj);
|
efl_key_data_set(child, "_elm_leaveme", pd->obj);
|
||||||
efl_canvas_object_clipper_set(child, pd->clipper);
|
efl_canvas_object_clipper_set(child, pd->clipper);
|
||||||
efl_event_callback_array_add(child, efl_ui_relative_layout_callbacks(), pd);
|
efl_event_callback_array_add(child, efl_ui_relative_layout_callbacks(), pd->obj);
|
||||||
efl_canvas_group_member_add(pd->obj, child);
|
efl_canvas_group_member_add(pd->obj, child);
|
||||||
efl_canvas_group_change(pd->obj);
|
efl_canvas_group_change(pd->obj);
|
||||||
|
|
||||||
|
@ -366,19 +362,26 @@ _hash_free_cb(void *data)
|
||||||
{
|
{
|
||||||
Efl_Ui_Relative_Layout_Child *child = data;
|
Efl_Ui_Relative_Layout_Child *child = data;
|
||||||
|
|
||||||
|
efl_canvas_group_member_remove(child->layout, child->obj);
|
||||||
|
efl_canvas_object_clipper_set(child->obj, NULL);
|
||||||
|
efl_key_data_set(child->obj, "_elm_leaveme", NULL);
|
||||||
|
efl_event_callback_array_del(child->obj, efl_ui_relative_layout_callbacks(),
|
||||||
|
child->layout);
|
||||||
|
|
||||||
|
if (!efl_invalidated_get(child->obj))
|
||||||
|
_elm_widget_sub_object_redirect_to_top(child->layout, child->obj);
|
||||||
|
|
||||||
free(child);
|
free(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static void
|
||||||
_hash_free_foreach_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED,
|
_hash_clear_cb(void *data)
|
||||||
void *data, void *fdata EINA_UNUSED)
|
|
||||||
{
|
{
|
||||||
Efl_Ui_Relative_Layout_Child *child = data;
|
Efl_Ui_Relative_Layout_Child *child = data;
|
||||||
|
|
||||||
_elm_widget_sub_object_redirect_to_top(child->layout, child->obj);
|
efl_event_callback_array_del(child->obj, efl_ui_relative_layout_callbacks(),
|
||||||
_hash_free_cb(child);
|
child->layout);
|
||||||
|
efl_del(child->obj);
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
|
@ -558,14 +561,9 @@ _efl_ui_relative_layout_efl_object_constructor(Eo *obj, Efl_Ui_Relative_Layout_D
|
||||||
EOLIAN static void
|
EOLIAN static void
|
||||||
_efl_ui_relative_layout_efl_object_invalidate(Eo *obj, Efl_Ui_Relative_Layout_Data *pd)
|
_efl_ui_relative_layout_efl_object_invalidate(Eo *obj, Efl_Ui_Relative_Layout_Data *pd)
|
||||||
{
|
{
|
||||||
Eo *child;
|
|
||||||
|
|
||||||
efl_invalidate(efl_super(obj, MY_CLASS));
|
efl_invalidate(efl_super(obj, MY_CLASS));
|
||||||
|
|
||||||
EINA_LIST_FREE(pd->children, child)
|
eina_hash_free_buckets(pd->children);
|
||||||
{
|
|
||||||
efl_event_callback_array_del(child, efl_ui_relative_layout_callbacks(), pd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN static void
|
EOLIAN static void
|
||||||
|
@ -578,35 +576,101 @@ _efl_ui_relative_layout_efl_object_destructor(Eo *obj, Efl_Ui_Relative_Layout_Da
|
||||||
efl_destructor(efl_super(obj, MY_CLASS));
|
efl_destructor(efl_super(obj, MY_CLASS));
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN static void
|
EOLIAN static Eina_Bool
|
||||||
_efl_ui_relative_layout_unregister(Eo *obj, Efl_Ui_Relative_Layout_Data *pd, Efl_Object *child)
|
_efl_ui_relative_layout_efl_pack_pack(Eo *obj EINA_UNUSED, Efl_Ui_Relative_Layout_Data *pd, Efl_Gfx_Entity *subobj)
|
||||||
{
|
{
|
||||||
_elm_widget_sub_object_redirect_to_top(obj, child);
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(subobj, EINA_FALSE);
|
||||||
if (eina_hash_del_by_key(pd->children, &child))
|
EINA_SAFETY_ON_TRUE_RETURN_VAL(!!eina_hash_find(pd->children, &subobj), EINA_FALSE);
|
||||||
{
|
|
||||||
efl_canvas_group_member_remove(obj, child);
|
return !!_efl_ui_relative_layout_register(pd, subobj);
|
||||||
efl_canvas_object_clipper_set(child, NULL);
|
|
||||||
efl_key_data_set(child, "_elm_leaveme", NULL);
|
|
||||||
efl_event_callback_array_del(child, efl_ui_relative_layout_callbacks(), pd);
|
|
||||||
efl_pack_layout_request(obj);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ERR("child(%p(%s)) is not registered", child, efl_class_name_get(child));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN static void
|
EOLIAN static Eina_Bool
|
||||||
_efl_ui_relative_layout_unregister_all(Eo *obj, Efl_Ui_Relative_Layout_Data *pd)
|
_efl_ui_relative_layout_efl_pack_unpack(Eo *obj, Efl_Ui_Relative_Layout_Data *pd, Efl_Object *child)
|
||||||
{
|
{
|
||||||
eina_hash_foreach(pd->children, _hash_free_foreach_cb, NULL);
|
if (!eina_hash_del_by_key(pd->children, &child))
|
||||||
|
{
|
||||||
|
ERR("child(%p(%s)) is not registered", child, efl_class_name_get(child));
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
efl_pack_layout_request(obj);
|
efl_pack_layout_request(obj);
|
||||||
|
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN static Eina_Bool
|
||||||
|
_efl_ui_relative_layout_efl_pack_unpack_all(Eo *obj, Efl_Ui_Relative_Layout_Data *pd)
|
||||||
|
{
|
||||||
|
eina_hash_free_buckets(pd->children);
|
||||||
|
efl_pack_layout_request(obj);
|
||||||
|
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN static Eina_Bool
|
||||||
|
_efl_ui_relative_layout_efl_pack_pack_clear(Eo *obj, Efl_Ui_Relative_Layout_Data *pd)
|
||||||
|
{
|
||||||
|
eina_hash_free_cb_set(pd->children, _hash_clear_cb);
|
||||||
|
eina_hash_free_buckets(pd->children);
|
||||||
|
eina_hash_free_cb_set(pd->children, _hash_free_cb);
|
||||||
|
|
||||||
|
efl_pack_layout_request(obj);
|
||||||
|
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_Bool
|
||||||
|
_efl_ui_relative_layout_content_iterator_next(Efl_Ui_Relative_Layout_Content_Iterator *it, void **data)
|
||||||
|
{
|
||||||
|
Efl_Ui_Relative_Layout_Child *child;
|
||||||
|
|
||||||
|
if (!eina_iterator_next(it->real_iterator, (void **) &child))
|
||||||
|
return EINA_FALSE;
|
||||||
|
|
||||||
|
if (data) *data = child->obj;
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eo *
|
||||||
|
_efl_ui_relative_layout_content_iterator_get_container(Efl_Ui_Relative_Layout_Content_Iterator *it)
|
||||||
|
{
|
||||||
|
return it->relative_layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_efl_ui_relative_layout_content_iterator_free(Efl_Ui_Relative_Layout_Content_Iterator *it)
|
||||||
|
{
|
||||||
|
eina_iterator_free(it->real_iterator);
|
||||||
|
free(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN static Eina_Iterator *
|
EOLIAN static Eina_Iterator *
|
||||||
_efl_ui_relative_layout_children_iterate(Eo *obj EINA_UNUSED, Efl_Ui_Relative_Layout_Data *pd)
|
_efl_ui_relative_layout_efl_container_content_iterate(Eo *obj, Efl_Ui_Relative_Layout_Data *pd)
|
||||||
{
|
{
|
||||||
return eina_hash_iterator_data_new(pd->children);
|
Efl_Ui_Relative_Layout_Content_Iterator *it;
|
||||||
|
|
||||||
|
it = calloc(1, sizeof(*it));
|
||||||
|
if (!it) return NULL;
|
||||||
|
|
||||||
|
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
|
||||||
|
|
||||||
|
it->relative_layout = obj;
|
||||||
|
it->real_iterator = eina_hash_iterator_data_new(pd->children);
|
||||||
|
|
||||||
|
it->iterator.version = EINA_ITERATOR_VERSION;
|
||||||
|
it->iterator.next = FUNC_ITERATOR_NEXT(_efl_ui_relative_layout_content_iterator_next);
|
||||||
|
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
|
||||||
|
_efl_ui_relative_layout_content_iterator_get_container);
|
||||||
|
it->iterator.free = FUNC_ITERATOR_FREE(_efl_ui_relative_layout_content_iterator_free);
|
||||||
|
|
||||||
|
return &it->iterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN static int
|
||||||
|
_efl_ui_relative_layout_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Relative_Layout_Data *pd)
|
||||||
|
{
|
||||||
|
return eina_hash_population(pd->children);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFL_UI_RELATIVE_LAYOUT_RELATION_SET_GET(left, LEFT);
|
EFL_UI_RELATIVE_LAYOUT_RELATION_SET_GET(left, LEFT);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
class @beta Efl.Ui.Relative_Layout extends Efl.Ui.Widget implements Efl.Pack_Layout
|
class @beta Efl.Ui.Relative_Layout extends Efl.Ui.Widget implements Efl.Pack_Layout, Efl.Pack
|
||||||
{
|
{
|
||||||
[[The relative layout class.
|
[[The relative layout class.
|
||||||
|
|
||||||
|
@ -53,25 +53,18 @@ class @beta Efl.Ui.Relative_Layout extends Efl.Ui.Widget implements Efl.Pack_Lay
|
||||||
ranging from 0.0 to 1.0.]]
|
ranging from 0.0 to 1.0.]]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unregister {
|
|
||||||
[[Remove all relations of the child.]]
|
|
||||||
params {
|
|
||||||
@in child: Efl.Object; [[The child to unregister]]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unregister_all {
|
|
||||||
[[Remove all relations from the registered children. ]]
|
|
||||||
}
|
|
||||||
children_iterate {
|
|
||||||
[[Begin iterating over this object's children.]]
|
|
||||||
return: iterator<Efl.Object> @owned @warn_unused; [[Iterator to object children.]]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
implements {
|
implements {
|
||||||
Efl.Object.constructor;
|
Efl.Object.constructor;
|
||||||
Efl.Object.invalidate;
|
Efl.Object.invalidate;
|
||||||
Efl.Object.destructor;
|
Efl.Object.destructor;
|
||||||
Efl.Canvas.Group.group_calculate;
|
Efl.Canvas.Group.group_calculate;
|
||||||
|
Efl.Pack.pack_clear;
|
||||||
|
Efl.Pack.unpack_all;
|
||||||
|
Efl.Pack.unpack;
|
||||||
|
Efl.Pack.pack;
|
||||||
|
Efl.Container.content_iterate;
|
||||||
|
Efl.Container.content_count;
|
||||||
Efl.Gfx.Entity.position { set; }
|
Efl.Gfx.Entity.position { set; }
|
||||||
Efl.Gfx.Entity.size { set; }
|
Efl.Gfx.Entity.size { set; }
|
||||||
Efl.Pack_Layout.layout_update;
|
Efl.Pack_Layout.layout_update;
|
||||||
|
|
|
@ -21,6 +21,7 @@ typedef struct _Efl_Ui_Relative_Layout_Data Efl_Ui_Relative_Layout_Data;
|
||||||
typedef struct _Efl_Ui_Relative_Layout_Child Efl_Ui_Relative_Layout_Child;
|
typedef struct _Efl_Ui_Relative_Layout_Child Efl_Ui_Relative_Layout_Child;
|
||||||
typedef struct _Efl_Ui_Relative_Layout_Calc Efl_Ui_Relative_Layout_Calc;
|
typedef struct _Efl_Ui_Relative_Layout_Calc Efl_Ui_Relative_Layout_Calc;
|
||||||
typedef struct _Efl_Ui_Relative_Layout_Relation Efl_Ui_Relative_Layout_Relation;
|
typedef struct _Efl_Ui_Relative_Layout_Relation Efl_Ui_Relative_Layout_Relation;
|
||||||
|
typedef struct _Efl_Ui_Relative_Layout_Content_Iterator Efl_Ui_Relative_Layout_Content_Iterator;
|
||||||
|
|
||||||
struct _Efl_Ui_Relative_Layout_Calc
|
struct _Efl_Ui_Relative_Layout_Calc
|
||||||
{
|
{
|
||||||
|
@ -68,6 +69,13 @@ struct _Efl_Ui_Relative_Layout_Child
|
||||||
Efl_Ui_Relative_Layout_Calc calc;
|
Efl_Ui_Relative_Layout_Calc calc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _Efl_Ui_Relative_Layout_Content_Iterator
|
||||||
|
{
|
||||||
|
Eina_Iterator iterator;
|
||||||
|
Eina_Iterator *real_iterator;
|
||||||
|
Eo *relative_layout;
|
||||||
|
};
|
||||||
|
|
||||||
#define EFL_UI_RELATIVE_LAYOUT_RELATION_SET_GET(direction, DIRECTION) \
|
#define EFL_UI_RELATIVE_LAYOUT_RELATION_SET_GET(direction, DIRECTION) \
|
||||||
EOLIAN static void \
|
EOLIAN static void \
|
||||||
_efl_ui_relative_layout_relation_ ## direction ## _set(Eo *obj, Efl_Ui_Relative_Layout_Data *pd, Eo *child, Eo *target, double relative) \
|
_efl_ui_relative_layout_relation_ ## direction ## _set(Eo *obj, Efl_Ui_Relative_Layout_Data *pd, Eo *child, Eo *target, double relative) \
|
||||||
|
|
|
@ -243,8 +243,7 @@ EFL_START_TEST (efl_ui_relative_layout_layout_update)
|
||||||
{
|
{
|
||||||
int i, max_index = (sizeof(hints) / sizeof(Hint));
|
int i, max_index = (sizeof(hints) / sizeof(Hint));
|
||||||
|
|
||||||
Eo *btn = efl_add(EFL_UI_BUTTON_CLASS, layout,
|
Eo *btn = efl_add(EFL_UI_BUTTON_CLASS, layout, efl_pack(layout, efl_added));
|
||||||
efl_ui_relative_layout_relation_left_set(layout, efl_added, NULL, 0.0));
|
|
||||||
|
|
||||||
for (i = 0; i < max_index; i++)
|
for (i = 0; i < max_index; i++)
|
||||||
{
|
{
|
||||||
|
@ -342,6 +341,38 @@ EFL_START_TEST (efl_ui_relative_layout_relation_set)
|
||||||
}
|
}
|
||||||
EFL_END_TEST
|
EFL_END_TEST
|
||||||
|
|
||||||
|
EFL_START_TEST (efl_ui_relative_layout_pack)
|
||||||
|
{
|
||||||
|
Eo *btn[3], *child;
|
||||||
|
Eina_Iterator *it;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
btn[i] = efl_add(EFL_UI_BUTTON_CLASS, layout, efl_pack(layout, efl_added));
|
||||||
|
ck_assert_int_eq(efl_content_count(layout), 3);
|
||||||
|
|
||||||
|
it = efl_content_iterate(layout);
|
||||||
|
EINA_ITERATOR_FOREACH(it, child)
|
||||||
|
ck_assert_ptr_eq(layout, efl_canvas_object_render_parent_get(child));
|
||||||
|
eina_iterator_free(it);
|
||||||
|
|
||||||
|
efl_pack_unpack(layout, NULL);
|
||||||
|
ck_assert_int_eq(efl_content_count(layout), 3);
|
||||||
|
efl_pack_unpack(layout, btn[0]);
|
||||||
|
ck_assert_int_eq(efl_content_count(layout), 2);
|
||||||
|
efl_pack_unpack_all(layout);
|
||||||
|
ck_assert_int_eq(efl_content_count(layout), 0);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
efl_pack(layout, btn[i]);
|
||||||
|
ck_assert_int_eq(efl_content_count(layout), 3);
|
||||||
|
efl_pack_clear(layout);
|
||||||
|
ck_assert_int_eq(efl_content_count(layout), 0);
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
ck_assert(efl_invalidated_get(btn[i]));
|
||||||
|
}
|
||||||
|
EFL_END_TEST
|
||||||
|
|
||||||
void efl_ui_test_relative_layout(TCase *tc)
|
void efl_ui_test_relative_layout(TCase *tc)
|
||||||
{
|
{
|
||||||
tcase_add_checked_fixture(tc, layout_setup, layout_teardown);
|
tcase_add_checked_fixture(tc, layout_setup, layout_teardown);
|
||||||
|
@ -349,4 +380,5 @@ void efl_ui_test_relative_layout(TCase *tc)
|
||||||
tcase_add_test(tc, efl_ui_relative_layout_layout_update);
|
tcase_add_test(tc, efl_ui_relative_layout_layout_update);
|
||||||
tcase_add_test(tc, efl_ui_relative_layout_layout_update_chain);
|
tcase_add_test(tc, efl_ui_relative_layout_layout_update_chain);
|
||||||
tcase_add_test(tc, efl_ui_relative_layout_relation_set);
|
tcase_add_test(tc, efl_ui_relative_layout_relation_set);
|
||||||
|
tcase_add_test(tc, efl_ui_relative_layout_pack);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
/* spec-meta-start
|
/* spec-meta-start
|
||||||
{"test-interface":"Efl.Pack",
|
{"test-interface":"Efl.Pack",
|
||||||
"test-widgets": ["Efl.Ui.Table"]}
|
"test-widgets": ["Efl.Ui.Table", "Efl.Ui.Relative_Layout"]}
|
||||||
|
|
||||||
spec-meta-end */
|
spec-meta-end */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue