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);
 }
 

-- 


Reply via email to