efl_ui/tags: use flow box internally

the existing layout code here is basically just a flow box, so use that
instead to avoid mixing legacy widgets in unified ones

Reviewed-by: Cedric BAIL <cedric.bail@free.fr>
Differential Revision: https://phab.enlightenment.org/D9463
This commit is contained in:
Mike Blumenkrantz 2019-07-31 14:02:47 -04:00 committed by Cedric BAIL
parent 32cffb4494
commit dd11dadfef
1 changed files with 29 additions and 179 deletions

View File

@ -50,12 +50,12 @@ _shrink_mode_set(Eo *obj,
if (shrink == EINA_TRUE)
{
Evas_Coord w = 0;
Evas_Coord box_inner_item_width_padding = 0;
double box_inner_item_width_padding = 0;
Eina_Value val;
elm_box_padding_get(sd->box, &box_inner_item_width_padding, NULL);
efl_gfx_arrangement_content_padding_get(sd->box, &box_inner_item_width_padding, NULL, NULL);
// unpack all items and entry
elm_box_unpack_all(sd->box);
efl_pack_unpack_all(sd->box);
EINA_LIST_FOREACH(sd->layouts, l, layout)
{
evas_object_hide(layout);
@ -65,7 +65,7 @@ _shrink_mode_set(Eo *obj,
if (sd->label && sd->label_packed)
{
elm_box_pack_end(sd->box, sd->label);
efl_pack(sd->box, sd->label);
Eina_Size2D label_min =
efl_gfx_hint_size_combined_min_get(sd->label);
w -= label_min.w;
@ -79,7 +79,7 @@ _shrink_mode_set(Eo *obj,
{
Evas_Coord w_label_count = 0, h = 0;
elm_box_pack_end(sd->box, layout);
efl_pack(sd->box, layout);
evas_object_show(layout);
Eina_Size2D item_min =
@ -107,7 +107,7 @@ _shrink_mode_set(Eo *obj,
if ((w < 0) || (w < w_label_count))
{
Eina_Strbuf *strbuf = eina_strbuf_new();
elm_box_unpack(sd->box, layout);
efl_pack_unpack(sd->box, layout);
evas_object_hide(layout);
count++;
@ -120,7 +120,7 @@ _shrink_mode_set(Eo *obj,
edje_object_size_min_calc(sd->end, &w_label_count, &h);
elm_coords_finger_size_adjust(1, &w_label_count, 1, &h);
efl_gfx_hint_size_restricted_min_set(sd->end, EINA_SIZE2D(w_label_count, h));
elm_box_pack_end(sd->box, sd->end);
efl_pack(sd->box, sd->end);
evas_object_show(sd->end);
break;
@ -139,7 +139,7 @@ _shrink_mode_set(Eo *obj,
else
{
// unpack all items and entry
elm_box_unpack_all(sd->box);
efl_pack_unpack_all(sd->box);
EINA_LIST_FOREACH(sd->layouts, l, layout)
{
evas_object_hide(layout);
@ -148,13 +148,13 @@ _shrink_mode_set(Eo *obj,
// pack buttons only 1line
if (sd->label && sd->label_packed) elm_box_pack_end(sd->box, sd->label);
if (sd->label && sd->label_packed) efl_pack(sd->box, sd->label);
// pack remain btns
layout = NULL;
EINA_LIST_FOREACH(sd->layouts, l, layout)
{
elm_box_pack_end(sd->box, layout);
efl_pack(sd->box, layout);
evas_object_show(layout);
}
@ -338,7 +338,7 @@ _on_item_deleted(void *data,
if (item == obj)
{
sd->layouts = eina_list_remove(sd->layouts, item);
elm_box_unpack(sd->box, item);
efl_pack_unpack(sd->box, item);
if (sd->selected_it == item)
sd->selected_it = NULL;
@ -440,9 +440,9 @@ _item_new(Efl_Ui_Tags_Data *sd,
else
{
if (sd->editable)
elm_box_pack_before(sd->box, layout, sd->entry);
efl_pack_before(sd->box, layout, sd->entry);
else
elm_box_pack_end(sd->box, layout);
efl_pack(sd->box, layout);
}
if (!efl_ui_focus_object_focus_get(obj) && sd->view_state == TAGS_VIEW_SHRINK && sd->w_box)
@ -487,14 +487,14 @@ _box_resize_cb(void *data,
Eina_Rect r;
Eina_List *l;
Eo *layout;
int hpad;
double hpad;
Efl_Ui_Tags_Data *sd = efl_data_scope_get(data, EFL_UI_TAGS_CLASS);
r = efl_gfx_entity_geometry_get(sd->box);
if ((r.w <= elm_config_finger_size_get()) || (r.h <= elm_config_finger_size_get())) return;
elm_box_padding_get(obj, &hpad, NULL);
efl_gfx_arrangement_content_padding_get(obj, &hpad, NULL, NULL);
if (sd->h_box < r.h)
efl_event_callback_call
@ -710,180 +710,35 @@ _label_set(Evas_Object *obj,
if (!strlen(str))
{
sd->label_packed = EINA_FALSE;
elm_box_unpack(sd->box, sd->label);
efl_pack_unpack(sd->box, sd->label);
evas_object_hide(sd->label);
}
else
{
if (sd->label_packed)
elm_box_unpack(sd->box, sd->label);
efl_pack_unpack(sd->box, sd->label);
sd->label_packed = EINA_TRUE;
edje_object_size_min_calc(sd->label, &width, &height);
evas_object_size_hint_min_set(sd->label, width, height);
elm_box_pack_start(sd->box, sd->label);
efl_pack_begin(sd->box, sd->label);
evas_object_show(sd->label);
}
_view_update(sd);
}
static Eina_Bool
_box_min_size_calculate(Evas_Object *box,
Evas_Object_Box_Data *priv,
int *line_height,
void *data EINA_UNUSED)
{
Evas_Coord w, linew = 0, lineh = 0;
Eina_Size2D box_min;
Eina_Size2D min;
int line_num;
Eina_List *l;
Evas_Object_Box_Option *opt;
evas_object_geometry_get(box, NULL, NULL, &w, NULL);
box_min = efl_gfx_hint_size_combined_min_get(box);
if (!w) return EINA_FALSE;
line_num = 1;
EINA_LIST_FOREACH(priv->children, l, opt)
{
min = efl_gfx_hint_size_combined_min_get(opt->obj);
linew += min.w;
if (lineh < min.h) lineh = min.h;
if (linew > w)
{
linew = min.w;
line_num++;
}
if ((linew != 0) && (l != eina_list_last(priv->children)))
linew += priv->pad.h;
}
box_min.h = lineh * line_num + (line_num - 1) * priv->pad.v;
efl_gfx_hint_size_restricted_min_set(box, EINA_SIZE2D(box_min.w, box_min.h));
*line_height = lineh;
return EINA_TRUE;
}
static void
_box_layout_cb(Evas_Object *o,
Evas_Object_Box_Data *priv,
void *data)
{
Evas_Coord xx, yy;
Eina_Rect r;
Evas_Coord linew = 0, lineh = 0;
Eina_Size2D min;
Evas_Object_Box_Option *opt;
const Eina_List *l, *l_next;
Evas_Object *obj;
double ax, ay;
Eina_Bool rtl;
if (!_box_min_size_calculate(o, priv, &lineh, data)) return;
r = efl_gfx_entity_geometry_get(o);
min = efl_gfx_hint_size_combined_min_get(o);
efl_gfx_hint_align_get(o, &ax, &ay);
rtl = efl_ui_mirrored_get(data);
if (rtl) ax = 1.0 - ax;
if (r.w < min.w)
{
r.x = r.x + ((r.w - min.w) * (1.0 - ax));
r.w = min.w;
}
if (r.h < min.h)
{
r.y = r.y + ((r.h - min.h) * (1.0 - ay));
r.h = min.h;
}
xx = r.x;
yy = r.y;
EINA_LIST_FOREACH_SAFE(priv->children, l, l_next, opt)
{
Eina_Size2D obj_min;
Evas_Coord ww, hh, ow, oh;
double wx, wy;
Eina_Bool fx, fy;
obj = opt->obj;
evas_object_size_hint_align_get(obj, &ax, &ay);
evas_object_size_hint_weight_get(obj, &wx, &wy);
efl_gfx_hint_fill_get(obj, &fx, &fy);
obj_min = efl_gfx_hint_size_combined_min_get(obj);
if (EINA_DBL_EQ(ax, -1)) { fx = 1; ax = 0.5; }
else if (ax < 0) { ax = 0.0; }
if (EINA_DBL_EQ(ay, -1)) { fy = 1; ay = 0.5; }
else if (ay < 0) { ay = 0.0; }
if (rtl) ax = 1.0 - ax;
ww = obj_min.w;
if (!EINA_DBL_EQ(wx, 0))
{
if (ww <= r.w - linew) ww = r.w - linew;
else ww = r.w;
}
hh = lineh;
ow = obj_min.w;
if (fx) ow = ww;
oh = obj_min.h;
if (fy) oh = hh;
linew += ww;
if (linew > r.w && l != priv->children)
{
xx = r.x;
yy += hh;
yy += priv->pad.v;
linew = ww;
}
evas_object_geometry_set(obj,
((!rtl) ? (xx) : (r.x + (r.w - (xx - r.x) - ww)))
+ (Evas_Coord)(((double)(ww - ow)) * ax),
yy + (Evas_Coord)(((double)(hh - oh)) * ay),
ow, oh);
xx += ww;
xx += priv->pad.h;
if (linew > r.w)
{
opt = eina_list_data_get(l_next);
if (opt && opt->obj && efl_isa(opt->obj, ELM_ENTRY_CLASS))
{
xx = r.x;
yy += hh;
yy += priv->pad.v;
linew = 0;
}
}
if ((linew != 0) && (l != eina_list_last(priv->children)))
linew += priv->pad.h;
}
}
static void
_view_init(Evas_Object *obj, Efl_Ui_Tags_Data *sd)
{
const char *str;
double pad_scale;
int hpad = 0, vpad = 0;
//FIXME: efl_ui_box doesn't support box_layout customizing.
// So i use legacy box here.
sd->box = elm_box_add(obj);
sd->box = efl_add(EFL_UI_BOX_FLOW_CLASS, obj,
efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL),
efl_gfx_arrangement_content_align_set(efl_added, 0, 0),
efl_gfx_hint_align_set(efl_added, 0, 0));
if (!sd->box) return;
@ -891,13 +746,9 @@ _view_init(Evas_Object *obj, Efl_Ui_Tags_Data *sd)
if (str) hpad = atoi(str);
str = elm_layout_data_get(obj, "vertical_pad");
if (str) vpad = atoi(str);
pad_scale = efl_gfx_entity_scale_get(obj) * elm_config_scale_get()
/ edje_object_base_scale_get(elm_layout_edje_get(obj));
elm_box_padding_set(sd->box, (hpad * pad_scale), (vpad * pad_scale));
efl_gfx_arrangement_content_padding_set(sd->box, hpad, vpad, EINA_TRUE);
elm_box_layout_set(sd->box, _box_layout_cb, obj, NULL);
elm_box_homogeneous_set(sd->box, EINA_FALSE);
elm_layout_content_set(obj, "efl.box", sd->box);
efl_content_set(efl_part(obj, "efl.box"), sd->box);
sd->label = edje_object_add(evas_object_evas_get(obj));
if (!sd->label) return;
@ -912,11 +763,10 @@ _view_init(Evas_Object *obj, Efl_Ui_Tags_Data *sd)
efl_composite_attach(obj, efl_added));
efl_gfx_hint_size_restricted_min_set(sd->entry, EINA_SIZE2D(MIN_W_ENTRY, 0));
evas_object_size_hint_weight_set
(sd->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
efl_gfx_hint_fill_set(sd->entry, EINA_TRUE, EINA_TRUE);
efl_gfx_hint_weight_set(sd->entry, EFL_GFX_HINT_EXPAND, 0);
efl_gfx_hint_fill_set(sd->entry, EINA_TRUE, EINA_FALSE);
elm_box_pack_end(sd->box, sd->entry);
efl_pack(sd->box, sd->entry);
sd->view_state = TAGS_VIEW_ENTRY;
@ -1067,12 +917,12 @@ _efl_ui_tags_editable_set(Eo *obj EINA_UNUSED, Efl_Ui_Tags_Data *sd, Eina_Bool e
if (sd->editable && (sd->view_state != TAGS_VIEW_SHRINK))
{
elm_box_pack_end(sd->box, sd->entry);
efl_pack(sd->box, sd->entry);
evas_object_show(sd->entry);
}
else
{
elm_box_unpack(sd->box, sd->entry);
efl_pack_unpack(sd->box, sd->entry);
evas_object_hide(sd->entry);
}
}