rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=28bd118d243ee1aa470c331292737e33a2ae6192
commit 28bd118d243ee1aa470c331292737e33a2ae6192 Author: Mykola Solyanko <m.solya...@samsung.com> Date: Thu Oct 22 14:26:43 2015 +0300 ewe_combobox: fix widget expansion --- src/lib/ewe_combobox.c | 149 ++++++++++++++++++++++++++----------------------- 1 file changed, 80 insertions(+), 69 deletions(-) diff --git a/src/lib/ewe_combobox.c b/src/lib/ewe_combobox.c index 35ef121..0d8ec72 100644 --- a/src/lib/ewe_combobox.c +++ b/src/lib/ewe_combobox.c @@ -70,67 +70,21 @@ _selected_cb(void *data, evas_object_smart_callback_call(sd->obj, "selected", item); } -static Evas_Object * -_exp_window_create(Evas **evas, Ewe_Combobox_Smart_Data *sd) -{ - Evas_Object *win; - - if (sd->win) - { - evas_object_smart_callback_del(sd->win, "unfocused", _focus_out_cb); - evas_object_del(sd->win); - } - win = elm_win_add(sd->top_win, "expand_window", ELM_WIN_DROPDOWN_MENU); - elm_win_autodel_set(win, EINA_TRUE); - elm_win_borderless_set(win, EINA_TRUE); - elm_win_focus_highlight_enabled_set(win, EINA_TRUE); - elm_win_activate(win); - elm_win_shaped_set(win, EINA_TRUE); - sd->win = win; - evas_object_smart_callback_add(sd->win, "unfocused", _focus_out_cb, sd); - evas_object_show(win); - *evas = evas_object_evas_get(win); - - sd->expander = edje_object_add(*evas); - edje_object_file_set(sd->expander, EWE_THEME, "ewe/combobox/expander/default"); - evas_object_show(sd->expander); - - sd->scroller = elm_scroller_add(win); - elm_object_style_set(sd->scroller, "ewe/default"); - edje_object_part_swallow(sd->expander, "swallow.part", sd->scroller); - evas_object_size_hint_weight_set(sd->scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_scroller_policy_set(sd->scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); - elm_scroller_content_min_limit(sd->scroller, EINA_TRUE, EINA_FALSE); - evas_object_focus_set(sd->scroller, EINA_TRUE); - evas_object_show(sd->scroller); - - sd->items_box = evas_object_box_add(*evas); - elm_object_content_set(sd->scroller, sd->items_box); - evas_object_box_align_set(sd->items_box, 0.0, 0.0); - evas_object_box_layout_set(sd->items_box, evas_object_box_layout_vertical, NULL, NULL); - evas_object_show(sd->items_box); - return win; -} - static void -_ewe_combobox_expand(Evas_Object *obj) +_combobox_geometry_calc(Evas *evas, + Ewe_Combobox_Smart_Data *sd, + int *width, + int *height) { - int b_w, b_h, scr_h, window_width = 0; + int b_w, b_h, scr_h; int top_widget_pos_x, top_widget_pos_y, sc_y_offset, list_count; + Evas_Coord combo_x, combo_y, combo_width, combo_height; Eina_List *l; - Evas_Coord combo_x, combo_y, combo_width, combo_height, expander_h; - Evas_Object *popup_win; - Evas *evas = NULL; Ewe_Combobox_Item *item; int holds_item; - EWE_COMBOBOX_DATA_GET(obj, sd); - edje_object_size_min_calc(sd->combobox, NULL, &combo_height); - sd->expanded = EINA_TRUE; evas_object_geometry_get(sd->combobox, &combo_x, &combo_y, &combo_width, NULL); - edje_object_signal_emit(sd->combobox, "ewe,state,expanded", "ewe"); - edje_object_signal_emit(sd->combobox, "btn,hide", "ewe"); evas_object_geometry_get(sd->top_win, &top_widget_pos_x, &top_widget_pos_y, NULL, NULL); elm_win_screen_size_get(sd->top_win, NULL, &sc_y_offset, NULL, &scr_h); @@ -139,8 +93,6 @@ _ewe_combobox_expand(Evas_Object *obj) combo_x += top_widget_pos_x; combo_y += combo_height + top_widget_pos_y; - popup_win = _exp_window_create(&evas, sd); - EINA_LIST_FOREACH(sd->items, l, item) { item->content = edje_object_add(evas); @@ -155,43 +107,102 @@ _ewe_combobox_expand(Evas_Object *obj) edje_object_part_text_set(item->content, "ewe.text", item->title); evas_object_show(item->content); edje_object_size_min_calc(item->content, &b_w, NULL); - if (window_width < b_w) - window_width = b_w; - evas_object_box_append(sd->items_box, item->content); - edje_object_signal_callback_add(item->content, "select", "ewe", - _selected_cb, item); + if ((*width) < b_w) + *width = b_w; } list_count = eina_list_count(sd->items); - expander_h = b_h = list_count * ITEM_H + ITEM_H / 4; + *height = b_h = list_count * ITEM_H + ITEM_H / 4; if (b_h > scr_h - combo_y) { holds_item = (scr_h - combo_y) / ITEM_H; - expander_h = holds_item * ITEM_H; + *height = holds_item * ITEM_H; if (holds_item < MIN_ITEMS) { - expander_h = b_h; + *height = b_h; int tmp = combo_y; combo_y -= combo_height + b_h; if (combo_y < 0) { combo_y = 0; - expander_h = tmp - combo_height; + *height = tmp - combo_height; } } } - if (window_width > combo_width) + if ((*width) < combo_width) + (*width) = combo_width; + + evas_object_geometry_set(sd->win, combo_x, combo_y, *width, *height); +} + +static void +_exp_window_create(Evas **evas, Ewe_Combobox_Smart_Data *sd) +{ + Evas_Object *win; + Eina_List *l; + Ewe_Combobox_Item *item; + int height, width = 0; + + if (sd->win) { - evas_object_resize(sd->expander, window_width, expander_h); - evas_object_geometry_set(popup_win, combo_x, combo_y, window_width, expander_h); + evas_object_smart_callback_del(sd->win, "unfocused", _focus_out_cb); + evas_object_del(sd->win); } - else + win = elm_win_add(sd->top_win, "expand_window", ELM_WIN_DROPDOWN_MENU); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_borderless_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_activate(win); + elm_win_shaped_set(win, EINA_TRUE); + sd->win = win; + evas_object_smart_callback_add(sd->win, "unfocused", _focus_out_cb, sd); + *evas = evas_object_evas_get(win); + _combobox_geometry_calc(*evas, sd, &width, &height); + evas_object_show(win); + + sd->expander = edje_object_add(*evas); + edje_object_file_set(sd->expander, EWE_THEME, "ewe/combobox/expander/default"); + evas_object_resize(sd->expander, width, height); + evas_object_show(sd->expander); + + sd->scroller = elm_scroller_add(win); + elm_object_style_set(sd->scroller, "ewe/default"); + edje_object_part_swallow(sd->expander, "swallow.part", sd->scroller); + evas_object_size_hint_weight_set(sd->scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_scroller_policy_set(sd->scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); + elm_scroller_content_min_limit(sd->scroller, EINA_TRUE, EINA_FALSE); + evas_object_focus_set(sd->scroller, EINA_TRUE); + evas_object_show(sd->scroller); + + sd->items_box = evas_object_box_add(*evas); + elm_object_content_set(sd->scroller, sd->items_box); + evas_object_box_align_set(sd->items_box, 0.0, 0.0); + evas_object_box_layout_set(sd->items_box, evas_object_box_layout_vertical, NULL, NULL); + evas_object_show(sd->items_box); + + EINA_LIST_FOREACH(sd->items, l, item) { - evas_object_resize(sd->expander, combo_width, expander_h); - evas_object_geometry_set(popup_win, combo_x, combo_y, combo_width, expander_h); + evas_object_box_append(sd->items_box, item->content); + edje_object_signal_callback_add(item->content, "select", "ewe", + _selected_cb, item); } +} + +static void +_ewe_combobox_expand(Evas_Object *obj) +{ + Evas *evas = NULL; + + EWE_COMBOBOX_DATA_GET(obj, sd); + + sd->expanded = EINA_TRUE; + edje_object_signal_emit(sd->combobox, "ewe,state,expanded", "ewe"); + edje_object_signal_emit(sd->combobox, "btn,hide", "ewe"); + + _exp_window_create(&evas, sd); + evas_object_smart_callback_call(sd->obj, "expanded", evas); } --