tasn pushed a commit to branch master.

http://git.enlightenment.org/tools/clouseau.git/commit/?id=7cf298430513877349bd68009480f4717135265a

commit 7cf298430513877349bd68009480f4717135265a
Author: Amitesh Singh <amitesh...@samsung.com>
Date:   Wed Jul 15 10:08:39 2015 +0100

    use hover + genlist instead of hoversel.
    
    Summary: This is required to support scroll in case of application list is 
long.
    
    Reviewers: tasn
    
    Subscribers: seoz
    
    Differential Revision: https://phab.enlightenment.org/D2800
---
 src/bin/clouseau_client.c | 177 ++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 154 insertions(+), 23 deletions(-)

diff --git a/src/bin/clouseau_client.c b/src/bin/clouseau_client.c
index 9606ba9..cbce09b 100644
--- a/src/bin/clouseau_client.c
+++ b/src/bin/clouseau_client.c
@@ -44,6 +44,8 @@ static int _clouseau_client_log_dom = -1;
 #define DBG(...) EINA_LOG_DOM_DBG(_clouseau_client_log_dom, __VA_ARGS__)
 
 static Evas_Object *prop_list = NULL;
+// Item class for app name list
+static Elm_Genlist_Item_Class *_app_itc = NULL;
 static Elm_Genlist_Item_Class _obj_info_itc;
 // Item class for objects classnames
 static Elm_Genlist_Item_Class _class_info_itc;
@@ -74,7 +76,13 @@ struct _Gui_Elementns
    Evas_Object *hbx;    /* The top menu box */
    Evas_Object *bt_load;
    Evas_Object *bt_save;
-   Evas_Object *dd_list;
+   struct {
+        Evas_Object *dd_list;
+        Evas_Object *obj;
+        Evas_Object *btn;
+        Evas_Object *resize_rect;
+        Eina_Bool is_expand : 1;
+   } hover;
    Evas_Object *gl;
    Evas_Object *prop_list;
    Evas_Object *connect_inwin;
@@ -342,7 +350,7 @@ _set_selected_app(void *data, Evas_Object *pobj,
           {  /* Got TREE_DATA from file, update this immidately */
               gui->sel_app = st;
              char *str = _app_name_get(st->app);
-             elm_object_text_set(pobj, str);
+             elm_object_text_set(gui->hover.btn, str);
              free(str);
              _load_list(gui);
              return;
@@ -352,7 +360,7 @@ _set_selected_app(void *data, Evas_Object *pobj,
           {  /* Reload only of selected some other app */
              gui->sel_app = st;
              char *str = _app_name_get(st->app);
-             elm_object_text_set(pobj, str);
+             elm_object_text_set(gui->hover.btn, str);
              free(str);
 
              elm_progressbar_pulse(gui->pb, EINA_FALSE);
@@ -362,7 +370,7 @@ _set_selected_app(void *data, Evas_Object *pobj,
      }
    else
      {  /* If we got a NULL ptr, reset lists and dd_list text */
-        elm_object_text_set(pobj, SELECT_APP_TEXT);
+        elm_object_text_set(gui->hover.btn, SELECT_APP_TEXT);
         elm_genlist_clear(gui->gl);
         elm_genlist_clear(gui->prop_list);
         gui->sel_app = NULL;
@@ -373,6 +381,8 @@ _set_selected_app(void *data, Evas_Object *pobj,
         elm_object_disabled_set(gui->bt_load, (gui->sel_app == NULL));
         elm_object_disabled_set(gui->bt_save, (gui->sel_app == NULL));
      }
+   elm_genlist_item_selected_set(elm_genlist_selected_item_get(pobj), 
EINA_FALSE);
+   elm_hover_dismiss(gui->hover.obj);
 }
 
 static int
@@ -384,14 +394,25 @@ _app_ptr_cmp(const void *d1, const void *d2)
    return ((app->ptr) - (unsigned long long) (uintptr_t) d2);
 }
 
+static char *
+_app_item_label_get(void *data, Evas_Object *obj EINA_UNUSED,
+                    const char *part EINA_UNUSED)
+{
+   App_Data_St *st = data;
+   char *str, *retstr;
+
+   str = _app_name_get(st->app);
+   retstr = strdup(str);
+   free(str);
+   return retstr;
+}
+
 static void
 _add_app_to_dd_list(Evas_Object *dd_list, App_Data_St *st)
 {  /* Add app to Drop Down List */
-   char *str = _app_name_get(st->app);
-   elm_hoversel_item_add(dd_list, str, NULL, ELM_ICON_NONE,
-         _set_selected_app, st);
-
-   free(str);
+   elm_genlist_item_append(dd_list, _app_itc, st,
+                           NULL, ELM_GENLIST_ITEM_NONE,
+                           _set_selected_app, st);
 }
 
 static int
@@ -442,7 +463,7 @@ _add_app(Gui_Elements *g, app_info_st *app)
    st->td = NULL; /* Will get this on TREE_DATA message */
    apps = eina_list_append(apps, st);
 
-   _add_app_to_dd_list(g->dd_list, st);
+   _add_app_to_dd_list(g->hover.dd_list, st);
 
    return st;
 }
@@ -491,7 +512,7 @@ _remove_app(Gui_Elements *g, app_closed_st *app)
 
    /* if NO app selected OR closing app is the selected one, reset display */
    if ((!sel_app) || (app->ptr == sel_app->ptr))
-     _set_selected_app(NULL, g->dd_list, NULL);
+     _set_selected_app(NULL, g->hover.dd_list, NULL);
 
    if (st)
      {  /* Remove from list and free all app info */
@@ -499,12 +520,15 @@ _remove_app(Gui_Elements *g, app_closed_st *app)
         apps = eina_list_remove(apps, st);
         _free_app(st);
 
-        if (elm_hoversel_expanded_get(g->dd_list))
-          elm_hoversel_hover_end(g->dd_list);
+        if (g->hover.is_expand)
+          {
+             elm_hover_dismiss(g->hover.obj);
+             g->hover.is_expand = EINA_FALSE;
+          }
 
-        elm_hoversel_clear(g->dd_list);
+        elm_genlist_clear(g->hover.dd_list);
         EINA_LIST_FOREACH(apps, l , st)
-           _add_app_to_dd_list(g->dd_list, st);
+           _add_app_to_dd_list(g->hover.dd_list, st);
      }
 }
 
@@ -1465,7 +1489,7 @@ _bt_load_file(void *data, Evas_Object *obj EINA_UNUSED, 
void *event_info)
              app->file = strdup(event_info);
              App_Data_St *st = _add_app(g, app);
              st->td = td;  /* This is the same as we got TREE_DATA message */
-             _set_selected_app(st, g->dd_list, NULL);
+             _set_selected_app(st, g->hover.dd_list, NULL);
           }
      }
 }
@@ -1958,11 +1982,92 @@ _jump_to_entry_activated(void *data,
    _jump_to_ptr(g, ptr);
 }
 
+static Eina_Bool
+_calc_list(Gui_Elements *g)
+{
+   int count = elm_genlist_items_count(g->hover.dd_list);
+
+   if (count == 0)
+     return EINA_FALSE;
+   else
+     {
+        Evas_Object *track;
+        Elm_Object_Item *item;
+        Evas_Coord w, h;
+        Eina_List *realized_items;
+
+        realized_items = elm_genlist_realized_items_get(g->hover.dd_list);
+        if (!realized_items) return EINA_FALSE;
+
+        item = realized_items->data;
+        track = elm_object_item_track(item);
+        evas_object_geometry_get(track, NULL, NULL, &w, &h);
+        elm_object_item_untrack(item);
+
+        eina_list_free(realized_items);
+
+        if (count < 6)
+          {
+             elm_scroller_policy_set(g->hover.dd_list, ELM_SCROLLER_POLICY_OFF,
+                                     ELM_SCROLLER_POLICY_OFF);
+             evas_object_size_hint_min_set(g->hover.resize_rect, w, h * count);
+          }
+        else
+          {
+             elm_scroller_policy_set(g->hover.dd_list, ELM_SCROLLER_POLICY_ON,
+                                     ELM_SCROLLER_POLICY_ON);
+             evas_object_size_hint_min_set(g->hover.resize_rect, w, h * 5);
+          }
+     }
+
+   return EINA_TRUE;
+}
+
+static void
+_show_hover(void *d, Evas_Object *o EINA_UNUSED,
+            void *ei EINA_UNUSED)
+{
+   Gui_Elements *g = d;
+
+   if (!_calc_list(g)) return;
+   evas_object_show(g->hover.dd_list);
+   evas_object_show(g->hover.obj);
+   g->hover.is_expand = EINA_TRUE;
+}
+
+static Evas_Object *
+_app_list_min_set(Gui_Elements *g, Evas_Coord w, Evas_Coord h)
+{
+   Evas_Object *table, *rect;
+
+   table = elm_table_add(g->hover.obj);
+
+   rect = evas_object_rectangle_add(evas_object_evas_get(table));
+   evas_object_size_hint_min_set(rect, w, h);
+   evas_object_color_set(rect, 0, 0, 0, 0);
+   evas_object_size_hint_align_set(rect, EVAS_HINT_FILL,
+                                   EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   elm_table_pack(table, rect, 0, 0, 1, 1);
+   evas_object_size_hint_align_set(g->hover.dd_list, EVAS_HINT_FILL,
+                                   EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(g->hover.dd_list, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+
+   elm_table_pack(table, g->hover.dd_list, 0, 0, 1, 1);
+   evas_object_show(rect);
+
+   g->hover.resize_rect = rect;
+
+   return table;
+}
+
 static void
 _control_buttons_create(Gui_Elements *g, Evas_Object *win)
 {
    Evas_Object *highlight_check;
-   Evas_Object *jump_to_entry, *frame;
+   Evas_Object *jump_to_entry, *frame, *table;
 
    frame = elm_frame_add(gui->bx);
    elm_object_style_set(frame, "pad_medium");
@@ -1985,13 +2090,39 @@ _control_buttons_create(Gui_Elements *g, Evas_Object 
*win)
    elm_box_pack_end(g->hbx, g->bt_load);
    evas_object_show(g->bt_load);
 
-   g->dd_list = elm_hoversel_add(g->hbx);
-   elm_hoversel_hover_parent_set(g->dd_list, win);
-   elm_object_text_set(g->dd_list, SELECT_APP_TEXT);
+   g->hover.btn = elm_button_add(g->hbx);
+   elm_object_style_set(g->hover.btn, "hoversel_vertical/default");
+   elm_object_text_set(g->hover.btn, SELECT_APP_TEXT);
+   evas_object_size_hint_align_set(g->hover.btn, 0.0, 0.3);
+   elm_box_pack_end(g->hbx, g->hover.btn);
+   evas_object_show(g->hover.btn);
 
-   evas_object_size_hint_align_set(g->dd_list, 0.0, 0.3);
-   elm_box_pack_end(g->hbx, g->dd_list);
-   evas_object_show(g->dd_list);
+   g->hover.obj = elm_hover_add(win);
+   elm_object_style_set(g->hover.obj, "hoversel_vertical/default");
+
+   if (!_app_itc)
+     {
+        _app_itc = elm_genlist_item_class_new();
+        _app_itc->item_style = "default";
+        _app_itc->func.text_get = _app_item_label_get;
+        _app_itc->func.state_get = NULL;
+        _app_itc->func.del = NULL;
+     }
+   g->hover.dd_list = elm_genlist_add(g->hover.obj);
+   elm_scroller_policy_set(g->hover.dd_list, ELM_SCROLLER_POLICY_OFF,
+                           ELM_SCROLLER_POLICY_OFF);
+   elm_object_style_set(g->hover.dd_list, "popup/no_inset_shadow");
+   evas_object_size_hint_align_set(g->hover.dd_list, EVAS_HINT_FILL,
+                                   EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(g->hover.dd_list, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   table = _app_list_min_set(g, 0, 0);
+   elm_object_part_content_set(g->hover.obj, "bottom", table);
+   elm_hover_target_set(g->hover.obj, g->hover.btn);
+   elm_hover_parent_set(g->hover.obj, win);
+
+   evas_object_smart_callback_add(g->hover.btn, "clicked",
+                                  _show_hover, g);
 
    highlight_check = elm_check_add(g->hbx);
    elm_object_text_set(highlight_check , "Highlight");

-- 


Reply via email to