multibuttonentry: Item width size set policy change.

Summary:
Item width max size set as 130 in edc before, i thinks that value doen't have any meaning,
so i changed the item max width size to follow container width size.

For modification, item size calc, box resize logic changed.

Test Plan:
1. Run elementary_test
2. Execute multibuttonentry sample.
3. Input some text for make item.

Reviewers: Hermet, seoz, woohyun, Jaehyun

Differential Revision: https://phab.enlightenment.org/D1970
This commit is contained in:
woochan lee 2015-03-04 20:38:04 +09:00 committed by Carsten Haitzler (Rasterman)
parent 22adafce60
commit 03af867581
2 changed files with 111 additions and 157 deletions

View File

@ -73,7 +73,6 @@ group { name: "elm/multibuttonentry/btn/default";
images.image: "sym_close_dark_normal.png" COMP;
images.image: "sym_close_dark_selected.png" COMP;
images.image: "win_glow.png" COMP;
data.item: "button_max_size" 130;
styles {
style { name: "multibuttonentry_textblock_style";
base: "font="FN" align=0.5 font_size=10 color=#ffffffff style=shadow,bottom shadow_color=#00000080 text_class=multibuttonentry_item ellipsis=1.0";

View File

@ -179,7 +179,7 @@ _shrink_mode_set(Evas_Object *obj,
EINA_LIST_FOREACH(sd->items, l, eo_item)
{
Evas_Coord w_label_count = 0, h = 0;
Evas_Coord item_w, w_label_count = 0, h = 0;
char *buf;
ELM_MULTIBUTTONENTRY_ITEM_DATA_GET(eo_item, item);
@ -187,7 +187,9 @@ _shrink_mode_set(Evas_Object *obj,
evas_object_show(VIEW(item));
item->visible = EINA_TRUE;
w -= item->vw;
evas_object_size_hint_min_get(VIEW(item), &item_w, NULL);
w -= item_w;
w -= box_inner_item_width_padding;
count--;
@ -511,38 +513,6 @@ _on_item_deleted(void *data,
}
}
static void
_item_resize(Evas_Object *obj,
Evas_Object *btn,
Evas_Coord *realw,
Evas_Coord *vieww)
{
Evas_Coord rw, vw;
const char *size_str;
Evas_Coord w_btn = 0, h_btn = 0, button_max_width = 0;
size_str = edje_object_data_get(elm_layout_edje_get(btn), "button_max_size");
if (size_str) button_max_width = atoi(size_str);
button_max_width *= elm_widget_scale_get(obj) * elm_config_scale_get();
// decide the size of button
edje_object_size_min_calc(elm_layout_edje_get(btn), &w_btn, &h_btn);
rw = w_btn;
if (button_max_width < w_btn) vw = button_max_width;
else vw = w_btn;
//resize item
elm_coords_finger_size_adjust(1, &vw, 1, &h_btn);
evas_object_resize(btn, vw, h_btn);
evas_object_size_hint_min_set(btn, vw, h_btn);
if (realw) *realw = rw;
if (vieww) *vieww = vw;
}
EOLIAN static void
_elm_multibuttonentry_item_elm_widget_item_signal_emit(Eo *eo_item EINA_UNUSED,
Elm_Multibuttonentry_Item_Data *item,
@ -566,7 +536,6 @@ _elm_multibuttonentry_item_elm_widget_item_part_text_set(Eo *eo_item EINA_UNUSED
dest_part = part;
edje_object_part_text_escaped_set(elm_layout_edje_get(VIEW(item)), dest_part, label);
_item_resize(item->base->widget, VIEW(item), &item->rw, &item->vw);
}
EOLIAN static const char *
@ -656,14 +625,13 @@ _item_new(Elm_Multibuttonentry_Data *sd,
void *data)
{
Eina_List *l;
Evas_Coord rw, vw;
Eo *eo_item;
Evas_Coord width = -1, height = -1;
Elm_Multibuttonentry_Item_Filter *item_filter;
Elm_Multibuttonentry_Item_Data *reference = eo_reference?
eo_data_scope_get(eo_reference, ELM_MULTIBUTTONENTRY_ITEM_CLASS):
NULL;
Evas_Object *obj;
int minw, minh, boxw;
obj = sd->parent;
@ -692,23 +660,25 @@ _item_new(Elm_Multibuttonentry_Data *sd,
//entry is cleared when text is made to button
elm_object_text_set(sd->entry, "");
evas_object_smart_calculate(VIEW(item));
edje_object_part_geometry_get
(elm_layout_edje_get(VIEW(item)), "elm.btn.text", NULL, NULL, &width, &height);
evas_object_size_hint_min_set(VIEW(item), width, height);
edje_object_signal_callback_add
(elm_layout_edje_get(VIEW(item)), "mouse,clicked,1", "*", _on_item_clicked, EO_OBJ(item));
edje_object_signal_callback_add
(elm_layout_edje_get(VIEW(item)), "elm,deleted", "elm", _on_item_deleted, EO_OBJ(item));
evas_object_size_hint_weight_set(VIEW(item), 0.0, 0.0);
evas_object_show(VIEW(item));
_item_resize(obj, VIEW(item), &rw, &vw);
evas_object_smart_calculate(VIEW(item));
evas_object_size_hint_min_get(VIEW(item), &minw, &minh);
evas_object_geometry_get(sd->box, NULL, NULL, &boxw, NULL);
if (sd->w_box && minw > boxw)
{
elm_coords_finger_size_adjust(1, &boxw, 1, &minh);
evas_object_size_hint_min_set(VIEW(item), boxw, minh);
evas_object_resize(VIEW(item), boxw, minh);
}
elm_object_focus_allow_set(VIEW(item), EINA_TRUE);
item->rw = rw;
item->vw = vw;
item->visible = EINA_TRUE;
// ACCESS
@ -854,24 +824,18 @@ _elm_multibuttonentry_elm_widget_event(Eo *obj EINA_UNUSED, Elm_Multibuttonentry
}
EOLIAN static void
_elm_multibuttonentry_elm_layout_sizing_eval(Eo *obj, Elm_Multibuttonentry_Data *sd)
_elm_multibuttonentry_elm_layout_sizing_eval(Eo *obj, Elm_Multibuttonentry_Data *sd EINA_UNUSED)
{
Evas_Coord minw = -1, minh = -1;
Evas_Coord left, right, top, bottom;
Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
evas_object_size_hint_min_get(sd->box, &minw, &minh);
edje_object_part_geometry_get
(wd->resize_obj, "top.left.pad", NULL, NULL, &left, &top);
edje_object_part_geometry_get
(wd->resize_obj, "bottom.right.pad", NULL, NULL, &right,
&bottom);
minw += (left + right);
minh += (top + bottom);
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
edje_object_size_min_restricted_calc
(wd->resize_obj, &minw, &minh, minw, minh);
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
evas_object_size_hint_min_set(obj, minw, minh);
evas_object_size_hint_max_set(obj, maxw, maxh);
}
static void
@ -889,8 +853,11 @@ _box_resize_cb(void *data,
Evas_Object *obj EINA_UNUSED,
void *event EINA_UNUSED)
{
Evas_Coord w, h, mnw, mnh;
Eina_List *l;
Elm_Object_Item *eo_it;
ELM_MULTIBUTTONENTRY_DATA_GET_OR_RETURN(data, sd);
Evas_Coord w, h;
evas_object_geometry_get(sd->box, NULL, NULL, &w, &h);
@ -899,10 +866,36 @@ _box_resize_cb(void *data,
else if (sd->h_box > h)
evas_object_smart_callback_call(sd->parent, SIG_CONTRACTED, NULL);
if (sd->w_box && sd->w_box != w)
{
if (sd->items)
{
EINA_LIST_FOREACH (sd->items, l, eo_it)
{
ELM_MULTIBUTTONENTRY_ITEM_DATA_GET(eo_it, it);
elm_layout_sizing_eval(VIEW(it));
evas_object_smart_calculate(VIEW(it));
evas_object_size_hint_min_get(VIEW(it), &mnw, &mnh);
if (mnw > w)
{
mnw = w;
evas_object_size_hint_min_set(VIEW(it), mnw, mnh);
evas_object_resize(VIEW(it), mnw, mnh);
}
}
}
}
if (!elm_object_focus_get(data) && !evas_object_visible_get(sd->entry))
{
_shrink_mode_set(data, EINA_TRUE);
}
sd->w_box = w;
sd->h_box = h;
_view_update(sd);
}
static void
@ -1158,109 +1151,66 @@ _filter_free(Elm_Multibuttonentry_Item_Filter *item_filter)
free(item_filter);
}
static void
static Eina_Bool
_box_min_size_calculate(Evas_Object *box,
Evas_Object_Box_Data *priv)
Evas_Object_Box_Data *priv,
int *line_height,
void *data EINA_UNUSED)
{
Evas_Coord minw, minh, mnw, mnh, ww;
Evas_Coord w, cw = 0, cmaxh = 0;
Evas_Coord mnw, mnh, w, minw, minh = 0, linew = 0, lineh = 0;
int line_num;
Eina_List *l, *l_next;
Evas_Object_Box_Option *opt;
const Eina_List *l;
double wx;
/* FIXME: need to calc max */
minw = 0;
minh = 0;
evas_object_geometry_get(box, NULL, NULL, &w, NULL);
evas_object_size_hint_min_get(box, &minw, NULL);
if (!w) return EINA_FALSE;
line_num = 1;
EINA_LIST_FOREACH(priv->children, l, opt)
{
evas_object_size_hint_min_get(opt->obj, &mnw, &mnh);
evas_object_size_hint_weight_get(opt->obj, &wx, NULL);
if (wx)
{
if (mnw != -1 && (w - cw) >= mnw)
ww = w - cw;
else
ww = w;
}
else
ww = mnw;
linew += mnw;
if (lineh < mnh) lineh = mnh;
if ((cw + mnw) > w)
if (linew > w)
{
minh += cmaxh;
cw = 0;
linew = mnw;
line_num++;
l_next = eina_list_next(l);
opt = eina_list_data_get(l_next);
if (l_next && opt && opt->obj &&
!strcmp(elm_widget_type_get(opt->obj), "elm_entry"))
{
linew = 0;
line_num++;
}
}
cw += ww;
if (cmaxh < mnh) cmaxh = mnh;
}
minh += cmaxh;
minh = lineh * line_num;
evas_object_size_hint_min_set(box, minw, minh);
}
*line_height = lineh;
static Evas_Coord
_item_max_height_calculate(Evas_Object *box,
Evas_Object_Box_Data *priv,
int obj_index)
{
Evas_Coord mnw, mnh, cw = 0, cmaxh = 0, w, ww;
Evas_Object_Box_Option *opt;
int local_index = 0;
const Eina_List *l;
double wx;
evas_object_geometry_get(box, NULL, NULL, &w, NULL);
EINA_LIST_FOREACH(priv->children, l, opt)
{
evas_object_size_hint_min_get(opt->obj, &mnw, &mnh);
evas_object_size_hint_weight_get(opt->obj, &wx, NULL);
if (wx)
{
if (mnw != -1 && (w - cw) >= mnw)
ww = w - cw;
else
ww = w;
}
else
ww = mnw;
if ((cw + ww) > w)
{
if (local_index > obj_index) return cmaxh;
cw = 0;
}
cw += ww;
if (cmaxh < mnh) cmaxh = mnh;
local_index++;
}
return cmaxh;
return EINA_TRUE;
}
static void
_box_layout_cb(Evas_Object *o,
Evas_Object_Box_Data *priv,
void *data EINA_UNUSED)
void *data)
{
Evas_Coord cw = 0, ch = 0, cmaxh = 0, obj_index = 0;
Evas_Coord x, y, w, h, xx, yy;
Evas_Coord minw, minh, linew = 0, lineh = 0;
Evas_Object_Box_Option *opt;
Evas_Coord minw, minh;
const Eina_List *l, *l_next;
Evas_Object *obj;
double ax, ay;
_box_min_size_calculate(o, priv);
if (!_box_min_size_calculate(o, priv, &lineh, data)) return;
evas_object_geometry_get(o, &x, &y, &w, &h);
@ -1282,7 +1232,7 @@ _box_layout_cb(Evas_Object *o,
EINA_LIST_FOREACH_SAFE(priv->children, l, l_next, opt)
{
Evas_Coord mnw, mnh, mxw, mxh;
Evas_Coord mnw, mnh;
Evas_Coord ww, hh, ow, oh;
double wx, wy;
int fw, fh;
@ -1291,44 +1241,49 @@ _box_layout_cb(Evas_Object *o,
evas_object_size_hint_align_get(obj, &ax, &ay);
evas_object_size_hint_weight_get(obj, &wx, &wy);
evas_object_size_hint_min_get(obj, &mnw, &mnh);
evas_object_size_hint_max_get(obj, &mxw, &mxh);
fw = fh = 0;
fw = fh = EINA_FALSE;
if (ax == -1.0) {fw = 1; ax = 0.5; }
if (ay == -1.0) {fh = 1; ay = 0.5; }
ww = mnw;
if (wx)
{
if (mnw != -1 && (w - cw) >= mnw)
ww = w - cw;
else
ww = w;
if (ww <= w - linew) ww = w - linew;
else ww = w;
}
else
ww = mnw;
hh = _item_max_height_calculate(o, priv, obj_index);
hh = lineh;
ow = mnw;
if (fw) ow = ww;
if ((mxw >= 0) && (mxw < ow)) ow = mxw;
oh = mnh;
if (fh) oh = hh;
if ((mxh >= 0) && (mxh < oh)) oh = mxh;
if ((cw + ww) > w)
linew += ww;
if (linew > w && l != priv->children)
{
ch += cmaxh;
cw = 0;
xx = x;
yy += hh;
linew = ww;
}
evas_object_move
(obj, xx + cw + (Evas_Coord)(((double)(ww - ow)) * ax),
yy + ch + (Evas_Coord)(((double)(hh - oh)) * ay));
evas_object_move(obj,
xx + (Evas_Coord)(((double)(ww - ow)) * ax),
yy + (Evas_Coord)(((double)(hh - oh)) * ay));
evas_object_resize(obj, ow, oh);
cw += ww;
if (cmaxh < hh) cmaxh = hh;
xx += ww;
obj_index++;
if (linew > w)
{
opt = eina_list_data_get(l_next);
if (opt && opt->obj && !strcmp(elm_widget_type_get(opt->obj), "elm_entry"))
{
xx = x;
yy += hh;
linew = 0;
}
}
}
}
@ -1338,7 +1293,7 @@ _view_init(Evas_Object *obj, Elm_Multibuttonentry_Data *sd)
sd->box = elm_box_add(obj);
if (!sd->box) return;
elm_box_layout_set(sd->box, _box_layout_cb, NULL, NULL);
elm_box_layout_set(sd->box, _box_layout_cb, obj, NULL);
elm_box_homogeneous_set(sd->box, EINA_FALSE);
elm_layout_content_set(obj, "box.swallow", sd->box);