efl/src/bin/elementary/test_ui_table.c

682 lines
21 KiB
C
Raw Normal View History

#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#define EFL_PACK_LAYOUT_PROTECTED
#include <Efl_Ui.h>
#include <Elementary.h>
static void _custom_layout_update(Eo *pack, void *_pd EINA_UNUSED);
static Evas_Object *objects[7] = {};
typedef enum {
NONE,
NONE_BUT_FILL,
EQUAL,
ONE,
TWO,
CUSTOM
} Weight_Mode;
static void
weights_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
EFL_OPS_DEFINE(custom_layout_ops,
EFL_OBJECT_OP_FUNC(efl_pack_layout_update, _custom_layout_update));
Weight_Mode mode = elm_radio_state_value_get(obj);
Eo *table = data;
if (mode != CUSTOM)
efl_object_override(table, NULL);
switch (mode)
{
case NONE:
efl_gfx_hint_align_set(table, 0.5, 0.5);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
for (int i = 1; i < 7; i++)
efl_gfx_hint_weight_set(objects[i], 0, 0);
break;
case NONE_BUT_FILL:
efl_gfx_hint_fill_set(table, EINA_TRUE, EINA_TRUE);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
for (int i = 1; i < 7; i++)
efl_gfx_hint_weight_set(objects[i], 0, 0);
break;
case EQUAL:
efl_gfx_hint_align_set(table, 0.5, 0.5);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
for (int i = 1; i < 7; i++)
efl_gfx_hint_weight_set(objects[i], 1, 1);
break;
case ONE:
efl_gfx_hint_align_set(table, 0.5, 0.5);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
for (int i = 1; i < 7; i++)
efl_gfx_hint_weight_set(objects[i], 0, 0);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
efl_gfx_hint_weight_set(objects[2], 1, 1);
break;
case TWO:
efl_gfx_hint_align_set(table, 0.5, 0.5);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
for (int i = 1; i < 7; i++)
efl_gfx_hint_weight_set(objects[i], 0, 0);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
efl_gfx_hint_weight_set(objects[2], 1, 1);
efl_gfx_hint_weight_set(objects[3], 1, 1);
break;
case CUSTOM:
efl_object_override(table, &custom_layout_ops);
break;
}
}
static void
user_min_slider_cb(void *data EINA_UNUSED, const Efl_Event *event)
{
int val = elm_slider_value_get(event->object);
for (int i = 0; i < 6; i++)
efl_gfx_hint_size_min_set(objects[i], EINA_SIZE2D(val, val));
}
static void
padding_slider_cb(void *data, const Efl_Event *event)
{
int val = elm_slider_value_get(event->object);
efl_gfx_arrangement_content_padding_set(data, val, val, EINA_TRUE);
}
static void
margin_slider_cb(void *data, const Efl_Event *event)
{
int val = elm_slider_value_get(event->object);
efl_gfx_hint_margin_set(data, val, val, val, val);
}
static void
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
btnmargins_slider_cb(void *data EINA_UNUSED, const Efl_Event *event)
{
int val = elm_slider_value_get(event->object);
for (int i = 1; i < 7; i++)
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
efl_gfx_hint_margin_set(objects[i], val, val, val, val);
}
static void
alignv_slider_cb(void *data EINA_UNUSED, const Efl_Event *event)
{
double ax, val;
val = elm_slider_value_get(event->object);
efl_gfx_hint_align_get(objects[1], &ax, NULL);
efl_gfx_hint_align_set(objects[1], ax, val);
}
static void
alignh_slider_cb(void *data EINA_UNUSED, const Efl_Event *event)
{
double ay, val;
val = elm_slider_value_get(event->object);
efl_gfx_hint_align_get(objects[1], NULL, &ay);
efl_gfx_hint_align_set(objects[1], val, ay);
}
static void
layout_updated_cb(void *data, const Efl_Event *event)
{
Elm_Label *o = data;
char buf[64];
int rows, cols, count;
efl_pack_table_size_get(event->object, &cols, &rows);
count = efl_content_count(event->object);
sprintf(buf, "%d items (%dx%d)", count, cols, rows);
elm_object_text_set(o, buf);
}
static void
child_evt_cb(void *data, const Efl_Event *event)
{
Elm_Label *o = data;
Efl_Gfx_Entity *it = event->info;
int col, row, colspan, rowspan;
char buf[64];
efl_pack_table_position_get(event->object, it, &col, &row, &colspan, &rowspan);
if (event->desc == EFL_CONTAINER_EVENT_CONTENT_ADDED)
sprintf(buf, "pack %d,%d %dx%d", col, row, colspan, rowspan);
else
sprintf(buf, "unpack %d,%d %dx%d", col, row, colspan, rowspan);
elm_object_text_set(o, buf);
}
static void
_custom_layout_update(Eo *pack, void *_pd EINA_UNUSED)
{
/* Example custom layout for table:
* divide space into regions of same size, place objects in center of their
* cells using their min size
* Note: This is a TERRIBLE layout function (disregards align, weig.ht, ...)
*/
int rows, cols, c, r, cs, rs, gmw = 0, gmh = 0;
Eina_Iterator *it;
Eina_Rect g;
Eo *item;
g = efl_gfx_entity_geometry_get(pack);
efl_pack_table_size_get(pack, &cols, &rows);
if (!cols || !rows) goto end;
it = efl_content_iterate(pack);
EINA_ITERATOR_FOREACH(it, item)
{
if (efl_pack_table_position_get(pack, item, &c, &r, &cs, &rs))
{
Eina_Rect m;
m.x = g.x + c * g.w / cols + (cs * g.w / cols - g.x) / 2;
m.y = g.y + r * g.h / rows + (rs * g.h / rows - g.y) / 2;
m.size = efl_gfx_hint_size_combined_min_get(item);
efl_gfx_entity_geometry_set(item, m);
gmw = MAX(gmw, m.w);
gmh = MAX(gmh, m.h);
}
}
eina_iterator_free(it);
end:
efl_gfx_hint_size_min_set(pack, EINA_SIZE2D(gmw * cols, gmh * rows));
}
void
test_ui_table(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *win, *bx, *o, *vbox, *f, *hbox, *chk, *table;
int i = 0;
win = elm_win_util_standard_add("ui-table", "Efl.Ui.Table");
elm_win_autodel_set(win, EINA_TRUE);
efl_gfx_entity_size_set(win, EINA_SIZE2D(600, 400));
vbox = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_arrangement_content_padding_set(vbox, 10, 10, EINA_TRUE);
efl_gfx_hint_weight_set(vbox, 1, 1);
efl_gfx_hint_margin_set(vbox, 5, 5, 5, 5);
elm_win_resize_object_add(win, vbox);
// create here to pass in cb
table = efl_add(EFL_UI_TABLE_CLASS, win);
/* controls */
f = elm_frame_add(win);
elm_object_text_set(f, "Controls");
efl_gfx_hint_align_set(f, -1, -1);
efl_gfx_hint_weight_set(f, 1, 0);
efl_pack(vbox, f);
efl_gfx_entity_visible_set(f, 1);
hbox = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL));
elm_object_content_set(f, hbox);
efl_gfx_arrangement_content_padding_set(hbox, 10, 0, EINA_TRUE);
/* weights radio group */
bx = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_hint_align_set(bx, 0, 0.5);
efl_gfx_hint_fill_set(bx, EINA_FALSE, EINA_TRUE);
efl_pack(hbox, bx);
chk = o = elm_radio_add(win);
elm_object_text_set(o, "No weight");
evas_object_smart_callback_add(o, "changed", weights_cb, table);
efl_gfx_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, NONE);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_radio_add(win);
elm_object_text_set(o, "No weight + table fill");
evas_object_smart_callback_add(o, "changed", weights_cb, table);
efl_gfx_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, NONE_BUT_FILL);
elm_radio_group_add(o, chk);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_radio_add(win);
elm_object_text_set(o, "Equal weights");
evas_object_smart_callback_add(o, "changed", weights_cb, table);
efl_gfx_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, EQUAL);
elm_radio_group_add(o, chk);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_radio_add(win);
elm_object_text_set(o, "One weight only");
evas_object_smart_callback_add(o, "changed", weights_cb, table);
efl_gfx_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, ONE);
elm_radio_group_add(o, chk);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_radio_add(win);
elm_object_text_set(o, "Two weights");
evas_object_smart_callback_add(o, "changed", weights_cb, table);
efl_gfx_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, TWO);
elm_radio_group_add(o, chk);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_radio_add(win);
elm_object_text_set(o, "Custom layout");
evas_object_smart_callback_add(o, "changed", weights_cb, table);
efl_gfx_hint_align_set(o, 0, 0.5);
elm_radio_state_value_set(o, CUSTOM);
elm_radio_group_add(o, chk);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
elm_radio_value_set(chk, EQUAL);
/* min size setter */
bx = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_hint_fill_set(bx, EINA_FALSE, EINA_TRUE);
efl_gfx_hint_weight_set(bx, 0, 1);
efl_pack(hbox, bx);
o = elm_label_add(win);
elm_object_text_set(o, "User min size");
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_slider_add(win);
elm_slider_indicator_format_set(o, "%.0fpx");
elm_slider_indicator_show_set(o, 1);
elm_slider_horizontal_set(o, 0);
efl_gfx_hint_align_set(o, 0.5, -1);
efl_gfx_hint_weight_set(o, 1, 1);
efl_event_callback_add(o, EFL_UI_SLIDER_EVENT_CHANGED, user_min_slider_cb, NULL);
elm_slider_min_max_set(o, 0, 250);
elm_slider_inverted_set(o, 1);
elm_slider_value_set(o, 0);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
/* inner box padding */
bx = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_hint_align_set(bx, 0, 0.5);
efl_gfx_hint_fill_set(bx, EINA_FALSE, EINA_TRUE);
efl_gfx_hint_weight_set(bx, 0, 1);
efl_pack(hbox, bx);
o = elm_label_add(win);
elm_object_text_set(o, "Padding");
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_slider_add(win);
elm_slider_indicator_format_set(o, "%.0fpx");
elm_slider_indicator_show_set(o, 1);
elm_slider_horizontal_set(o, 0);
efl_gfx_hint_align_set(o, 0.5, -1);
efl_gfx_hint_weight_set(o, 1, 1);
efl_event_callback_add(o, EFL_UI_SLIDER_EVENT_CHANGED, padding_slider_cb, table);
elm_slider_min_max_set(o, 0, 40);
elm_slider_inverted_set(o, 1);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
elm_slider_value_set(o, 0);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
/* outer margin */
bx = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_hint_fill_set(bx, EINA_FALSE, EINA_TRUE);
efl_gfx_hint_weight_set(bx, 0, 1);
efl_pack(hbox, bx);
o = elm_label_add(win);
elm_object_text_set(o, "Margin");
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_slider_add(win);
elm_slider_indicator_format_set(o, "%.0fpx");
elm_slider_indicator_show_set(o, 1);
elm_slider_horizontal_set(o, 0);
efl_gfx_hint_align_set(o, 0.5, -1);
efl_gfx_hint_weight_set(o, 1, 1);
efl_event_callback_add(o, EFL_UI_SLIDER_EVENT_CHANGED, margin_slider_cb, table);
elm_slider_min_max_set(o, 0, 40);
elm_slider_inverted_set(o, 1);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
elm_slider_value_set(o, 0);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
/* button margins */
bx = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_hint_align_set(bx, 0, 0.5);
efl_gfx_hint_fill_set(bx, EINA_FALSE, EINA_TRUE);
efl_gfx_hint_weight_set(bx, 1, 1);
efl_pack(hbox, bx);
o = elm_label_add(win);
elm_object_text_set(o, "Buttons margins");
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_slider_add(win);
elm_slider_indicator_format_set(o, "%.0fpx");
elm_slider_indicator_show_set(o, 1);
elm_slider_horizontal_set(o, 0);
efl_gfx_hint_align_set(o, 0.5, -1);
efl_gfx_hint_weight_set(o, 1, 1);
efl_event_callback_add(o, EFL_UI_SLIDER_EVENT_CHANGED, btnmargins_slider_cb, table);
elm_slider_min_max_set(o, 0, 40);
elm_slider_inverted_set(o, 1);
efl_ui_table: refactor layout_update Summary: There are three reasons to refactor layout_update of Efl.Ui.Table. === 1. Inconsistency of hint behavior. === Some hint property is often not respected. for example, hint_min is ignored in Table when it is used with hint_max even if hint_weight is 0. hint_aspect is always ignored in Table. The ambiguous behavior make it hard to layout widgets in container. of course, we documented 'it's just a hint that should be used whenever appropriate.' but i don't think it means that 'hint API is sometimes respected and we also don't know when that API is respected.'. at least there is rule for consistent behavior and we should be able to explain why a widget is located here and why some hint property is ignored. So, i'll suggest priority of hint property. this refactoring support following priority. 1) HintMin 2) HintMin + HintAspect 3) HintMargin 4) HintMax 5) HintAspect 6) HintWeight, HintFill 7) HintAlign ref T5487 Please check with unit test D7840 === 2. To Enhance usability. === Efl.Ui.Table is using homogeneous mode of evas_table which have same columns, rows size. but i think a table can generally change columns, rows size and we can provide homogeneous mode option.(D7892) In this patch - table columns(rows) min size is decided by maximum size among its cells width(height) min size. - table columns(rows) weight is decided by maximum weight among its cells horizontal(vertical) weight. Also, pack_align is implemented. it is used if no item has a weight. === 3. To remove internal evas_table. === This is low priority work. however, i guess is is necessary for lightweight container widget. there are two size_hint callback to adjust table size and efl_canvas_group_calculate is called twice when it is resized. This patch is first step to remove internal evas_table. Test Plan: make check elementary_test -to 'efl.ui.table' Reviewers: jpeg, Jaehyun_Cho, zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T5487 Differential Revision: https://phab.enlightenment.org/D7841
2019-02-27 11:45:27 -08:00
elm_slider_value_set(o, 0);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
/* button1 aligns */
bx = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_hint_align_set(bx, 0, 0.5);
efl_gfx_hint_fill_set(bx, EINA_FALSE, EINA_TRUE);
efl_gfx_hint_weight_set(bx, 1, 1);
efl_pack(hbox, bx);
o = elm_label_add(win);
elm_object_text_set(o, "Button1 align");
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_slider_add(win);
elm_slider_indicator_format_set(o, "%.1f");
elm_slider_indicator_show_set(o, 1);
elm_slider_horizontal_set(o, 0);
efl_gfx_hint_align_set(o, 0.5, -1);
efl_gfx_hint_weight_set(o, 1, 1);
efl_event_callback_add(o, EFL_UI_SLIDER_EVENT_CHANGED, alignv_slider_cb, NULL);
elm_slider_min_max_set(o, 0, 1);
elm_slider_value_set(o, 0.3);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_slider_add(win);
elm_slider_indicator_format_set(o, "%.1f");
elm_slider_indicator_show_set(o, 1);
elm_slider_horizontal_set(o, 1);
efl_gfx_hint_align_set(o, -1, -1);
efl_gfx_hint_weight_set(o, 1, 0);
efl_event_callback_add(o, EFL_UI_SLIDER_EVENT_CHANGED, alignh_slider_cb, NULL);
elm_slider_min_max_set(o, 0, 1);
elm_slider_value_set(o, 0.3);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
/* ro info */
bx = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_hint_align_set(bx, 0, 0.5);
efl_gfx_hint_fill_set(bx, EINA_FALSE, EINA_TRUE);
efl_gfx_hint_weight_set(bx, 1, 1);
efl_pack(hbox, bx);
o = elm_label_add(win);
elm_object_text_set(o, "<b>Properties</>");
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_label_add(win);
efl_event_callback_add(table, EFL_PACK_EVENT_LAYOUT_UPDATED, layout_updated_cb, o);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_label_add(win);
efl_event_callback_add(table, EFL_CONTAINER_EVENT_CONTENT_ADDED, child_evt_cb, o);
efl_event_callback_add(table, EFL_CONTAINER_EVENT_CONTENT_REMOVED, child_evt_cb, o);
efl_gfx_hint_align_set(o, 0.5, 0);
efl_gfx_hint_weight_set(o, 1, 1);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
/* contents */
f = elm_frame_add(win);
elm_object_text_set(f, "Contents");
efl_gfx_hint_align_set(f, -1, -1);
efl_gfx_hint_weight_set(f, 1, 1);
efl_pack(vbox, f);
efl_gfx_entity_visible_set(f, 1);
efl_gfx_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(f, table);
efl_gfx_entity_visible_set(table, 1);
objects[i++] = o = efl_add(EFL_CANVAS_RECTANGLE_CLASS, win);
efl_gfx_hint_size_min_set(o, EINA_SIZE2D(10, 10));
efl_gfx_color_set(o, 64, 96, 128, 255);
efl_pack_table(table, o, 0, 0, 3, 1);
objects[i++] = o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, "Button 1");
efl_gfx_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
efl_gfx_hint_fill_set(o, EINA_TRUE, EINA_TRUE);
efl_gfx_hint_align_set(o, 0.3, 0.3);
efl_gfx_hint_size_max_set(o, EINA_SIZE2D(100, 100));
efl_pack_table(table, o, 0, 0, 1, 1);
efl_gfx_entity_visible_set(o, 1);
objects[i++] = o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, "Button 2");
efl_gfx_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
efl_gfx_hint_fill_set(o, EINA_TRUE, EINA_TRUE);
efl_pack_table(table, o, 1, 0, 1, 1);
efl_gfx_entity_visible_set(o, 1);
objects[i++] = o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, "Button 3");
efl_gfx_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
efl_gfx_hint_fill_set(o, EINA_TRUE, EINA_TRUE);
efl_pack_table(table, o, 2, 0, 1, 1);
efl_gfx_entity_visible_set(o, 1);
objects[i++] = o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, "Button 4");
efl_gfx_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
efl_gfx_hint_fill_set(o, EINA_TRUE, EINA_TRUE);
efl_pack_table(table, o, 0, 1, 2, 1);
efl_gfx_entity_visible_set(o, 1);
objects[i++] = o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, "Button 5");
efl_gfx_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
efl_gfx_hint_fill_set(o, EINA_TRUE, EINA_TRUE);
efl_pack_table(table, o, 2, 1, 1, 2);
efl_gfx_entity_visible_set(o, 1);
objects[i++] = o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, "Button 6");
efl_gfx_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
efl_gfx_hint_fill_set(o, EINA_TRUE, EINA_TRUE);
efl_pack_table(table, o, 0, 2, 2, 1);
efl_gfx_entity_visible_set(o, 1);
efl_gfx_entity_visible_set(win, 1);
}
static const char *
btn_text(const char *str)
{
static char buf[64];
static int id = 0;
sprintf(buf, "%s %d", str ?: "item", ++id);
return buf;
}
static void
remove_cb(void *data EINA_UNUSED, const Efl_Event *ev)
{
efl_del(ev->object);
}
static void
append_cb(void *data, const Efl_Event *ev EINA_UNUSED)
{
Eo *table = data;
Eo *o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, btn_text("appended"));
efl_gfx_hint_weight_set(o, 0, 0);
efl_gfx_hint_fill_set(o, EINA_FALSE, EINA_FALSE);
efl_event_callback_add(o, EFL_INPUT_EVENT_CLICKED, remove_cb, NULL);
elm_object_tooltip_text_set(o, "Click to unpack");
efl_pack(table, o);
efl_gfx_entity_visible_set(o, 1);
}
static void
clear_cb(void *data, const Efl_Event *ev EINA_UNUSED)
{
Eo *table = data;
efl_pack_clear(table);
}
void
test_ui_table_linear(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *win, *o, *vbox, *f, *hbox, *table, *ico, *bx;
win = elm_win_util_standard_add("ui-table-linear", "Efl.Ui.Table Linear APIs");
elm_win_autodel_set(win, EINA_TRUE);
efl_gfx_entity_size_set(win, EINA_SIZE2D(600, 400));
vbox = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_arrangement_content_padding_set(vbox, 10, 10, EINA_TRUE);
efl_gfx_hint_margin_set(vbox, 5, 5, 5, 5);
elm_win_resize_object_add(win, vbox);
efl_gfx_entity_visible_set(vbox, 1);
// create here to pass in cb
table = efl_add(EFL_UI_TABLE_CLASS, win);
/* controls */
f = elm_frame_add(win);
elm_object_text_set(f, "Controls");
efl_gfx_hint_align_set(f, -1, -1);
efl_gfx_hint_weight_set(f, 1, 0);
efl_pack(vbox, f);
efl_gfx_entity_visible_set(f, 1);
hbox = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL));
elm_object_content_set(f, hbox);
efl_gfx_arrangement_content_padding_set(hbox, 5, 0, EINA_TRUE);
efl_gfx_entity_visible_set(hbox, 1);
ico = elm_icon_add(win);
elm_icon_standard_set(ico, "list-add");
o = elm_button_add(win);
elm_object_content_set(o, ico);
elm_object_text_set(o, "Append");
efl_event_callback_add(o, EFL_INPUT_EVENT_CLICKED, append_cb, table);
efl_pack(hbox, o);
efl_gfx_entity_visible_set(o, 1);
ico = elm_icon_add(win);
elm_icon_standard_set(ico, "edit-clear-all");
o = elm_button_add(win);
elm_object_content_set(o, ico);
elm_object_text_set(o, "Clear");
efl_event_callback_add(o, EFL_INPUT_EVENT_CLICKED, clear_cb, table);
efl_pack(hbox, o);
efl_gfx_entity_visible_set(o, 1);
/* ro info */
bx = efl_add(EFL_UI_BOX_CLASS, win,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
efl_gfx_hint_align_set(bx, 0, 0.5);
efl_gfx_hint_fill_set(bx, EINA_FALSE, EINA_TRUE);
efl_gfx_hint_weight_set(bx, 1, 1);
efl_pack(hbox, bx);
efl_gfx_entity_visible_set(bx, 1);
o = elm_label_add(win);
elm_object_text_set(o, "<b>Properties</>");
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_label_add(win);
efl_event_callback_add(table, EFL_PACK_EVENT_LAYOUT_UPDATED, layout_updated_cb, o);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
o = elm_label_add(win);
efl_event_callback_add(table, EFL_CONTAINER_EVENT_CONTENT_ADDED, child_evt_cb, o);
efl_event_callback_add(table, EFL_CONTAINER_EVENT_CONTENT_REMOVED, child_evt_cb, o);
efl_gfx_hint_align_set(o, 0.5, 0);
efl_gfx_hint_weight_set(o, 1, 1);
efl_pack(bx, o);
efl_gfx_entity_visible_set(o, 1);
/* contents */
f = elm_frame_add(win);
elm_object_text_set(f, "Contents");
efl_gfx_hint_align_set(f, -1, -1);
efl_gfx_hint_weight_set(f, 1, 1);
efl_pack(vbox, f);
efl_gfx_entity_visible_set(f, 1);
efl_pack_table_columns_set(table, 4);
efl_ui_layout_orientation_set(table, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL);
efl_gfx_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(f, table);
efl_gfx_entity_visible_set(table, 1);
o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, btn_text(NULL));
efl_gfx_hint_weight_set(o, 0, 0);
efl_gfx_hint_fill_set(o, EINA_FALSE, EINA_FALSE);
efl_event_callback_add(o, EFL_INPUT_EVENT_CLICKED, remove_cb, NULL);
efl_pack(table, o);
efl_gfx_entity_visible_set(o, 1);
o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, btn_text(NULL));
efl_gfx_hint_weight_set(o, 0, 0);
efl_gfx_hint_fill_set(o, EINA_FALSE, EINA_FALSE);
efl_event_callback_add(o, EFL_INPUT_EVENT_CLICKED, remove_cb, NULL);
efl_pack(table, o);
efl_gfx_entity_visible_set(o, 1);
o = efl_add(EFL_UI_BUTTON_CLASS, table);
efl_text_set(o, btn_text(NULL));
efl_gfx_hint_weight_set(o, 0, 0);
efl_gfx_hint_fill_set(o, EINA_FALSE, EINA_FALSE);
efl_event_callback_add(o, EFL_INPUT_EVENT_CLICKED, remove_cb, NULL);
efl_pack(table, o);
efl_gfx_entity_visible_set(o, 1);
efl_gfx_entity_visible_set(win, 1);
}