hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=647dbde8ca5bd06ebf400303f89c2d6cc6efa23d

commit 647dbde8ca5bd06ebf400303f89c2d6cc6efa23d
Author: Hermet Park <her...@hermet.pe.kr>
Date:   Mon Feb 29 00:05:44 2016 +0900

    edc_navigator: 3rd patchset.
    
    optimizing + stablizing functions.
---
 src/bin/base_gui.c          |  42 +++++++++--
 src/bin/edc_navigator.c     | 172 ++++++++++++++++++++++++++++++--------------
 src/include/base_gui.h      |   2 +
 src/include/edc_navigator.h |   2 +-
 4 files changed, 156 insertions(+), 62 deletions(-)

diff --git a/src/bin/base_gui.c b/src/bin/base_gui.c
index a76a89c..776febc 100644
--- a/src/bin/base_gui.c
+++ b/src/bin/base_gui.c
@@ -6,7 +6,8 @@ typedef struct base_s
    Evas_Object *layout;
    Evas_Object *console;
    Evas_Object *enventor;
-   Ecore_Timer *edc_navigator_timer;
+   Ecore_Timer *edc_navi_update_timer;
+   Ecore_Timer *edc_navi_reload_timer;
    Eina_Bool console_msg : 1;
 } base_data;
 
@@ -33,6 +34,18 @@ win_resize_cb(void *data EINA_UNUSED, Evas *o EINA_UNUSED, 
Evas_Object *obj,
 }
 
 static Eina_Bool
+edc_navigator_reload_timer_cb(void *data)
+{
+   base_data *bd = data;
+
+   edc_navigator_reload(stats_group_name_get());
+
+   bd->edc_navi_reload_timer = NULL;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
 edc_navigator_update_timer_cb(void *data)
 {
    base_data *bd = g_bd;
@@ -40,7 +53,7 @@ edc_navigator_update_timer_cb(void *data)
    const char *group_name = data;
    edc_navigator_group_update(group_name);
 
-   bd->edc_navigator_timer = NULL;
+   bd->edc_navi_update_timer = NULL;
 
    return ECORE_CALLBACK_CANCEL;
 }
@@ -92,7 +105,10 @@ void base_edc_navigator_toggle(Eina_Bool toggle)
    if (toggle) config_edc_navigator_set(!config_edc_navigator_get());
 
    if (config_edc_navigator_get())
-     elm_object_signal_emit(bd->layout, "elm,state,edc_navigator,show", "");
+     {
+        base_edc_navigator_reload();
+        elm_object_signal_emit(bd->layout, "elm,state,edc_navigator,show", "");
+     }
    else
      elm_object_signal_emit(bd->layout, "elm,state,edc_navigator,hide", "");
 }
@@ -211,7 +227,8 @@ base_gui_term(void)
    base_data *bd = g_bd;
    if (!bd) return;
 
-   ecore_timer_del(bd->edc_navigator_timer);
+   ecore_timer_del(bd->edc_navi_update_timer);
+   ecore_timer_del(bd->edc_navi_reload_timer);
    edc_navigator_term();
    panes_term();
 
@@ -222,18 +239,29 @@ base_gui_term(void)
 void
 base_edc_navigator_group_update(const char *group_name)
 {
+   if (!config_edc_navigator_get()) return;
+
    base_data *bd = g_bd;
    if (!bd) return;
 
-   ecore_timer_del(bd->edc_navigator_timer);
-   bd->edc_navigator_timer = ecore_timer_add(1, edc_navigator_update_timer_cb,
+   ecore_timer_del(bd->edc_navi_update_timer);
+   bd->edc_navi_update_timer = ecore_timer_add(EDC_NAVIGATOR_UPDATE_TIME,
+                                             edc_navigator_update_timer_cb,
                                              group_name);
 }
 
 void
 base_edc_navigator_reload(void)
 {
-   edc_navigator_reload();
+   if (!config_edc_navigator_get()) return;
+
+   base_data *bd = g_bd;
+   if (!bd) return;
+
+   ecore_timer_del(bd->edc_navi_reload_timer);
+   bd->edc_navi_reload_timer = ecore_timer_add(EDC_NAVIGATOR_UPDATE_TIME,
+                                               edc_navigator_reload_timer_cb,
+                                               bd);
 }
 
 void
diff --git a/src/bin/edc_navigator.c b/src/bin/edc_navigator.c
index 709b3b5..fba395c 100644
--- a/src/bin/edc_navigator.c
+++ b/src/bin/edc_navigator.c
@@ -7,14 +7,18 @@ typedef struct edc_navigator_s
    Eina_List *group_items;                 //group object item
    Eina_List *part_items;                  //part object item
    Eina_List *state_items;                 //state object item
+   Eina_List *program_items;               //program object item
 
    Eina_List *group_list;                  //group name list
    Eina_List *part_list;                   //part name list
    Eina_List *state_list;                  //state name list
+   Eina_List *program_list;                //program name list
 
    Elm_Genlist_Item_Class *group_itc;
    Elm_Genlist_Item_Class *part_itc;
    Elm_Genlist_Item_Class *state_itc;
+   Elm_Genlist_Item_Class *program_itc;
+
 } navi_data;
 
 typedef struct part_item_data_s
@@ -25,6 +29,9 @@ typedef struct part_item_data_s
 
 static navi_data *g_nd = NULL;
 
+static void
+gl_part_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info);
+
 /*****************************************************************************/
 /* Internal method implementation                                            */
 /*****************************************************************************/
@@ -32,6 +39,7 @@ static void
 gl_state_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info)
 {
    Elm_Object_Item *it = event_info;
+
    //TODO: Search Current State
 }
 
@@ -45,12 +53,13 @@ states_reload(navi_data *nd, Elm_Object_Item *part_it)
    Elm_Object_Item *it;
 
    //Remove Previous Parts
-   EINA_LIST_FREE(nd->state_items, it)
-     elm_object_item_del(it);
+
+   //FIXME: Maybe we could optimize if parts list hasn't been changed.
+   EINA_LIST_FREE(nd->state_items, it) elm_object_item_del(it);
+   edje_edit_string_list_free(nd->state_list);
 
    //Append States
    Evas_Object *enventor = base_enventor_get();
-   edje_edit_string_list_free(nd->state_list);
    nd->state_list = enventor_object_part_states_list_get(enventor, part);
    char *name;
 
@@ -67,6 +76,44 @@ states_reload(navi_data *nd, Elm_Object_Item *part_it)
      }
 }
 
+static void
+parts_reload(navi_data *nd, Elm_Object_Item *group_it)
+{
+   Eina_List *l;
+   Elm_Object_Item *it;
+
+   //Remove Previous Parts
+
+   //FIXME: Maybe we could optimize if parts list hasn't been changed.
+   EINA_LIST_FREE(nd->part_items, it) elm_object_item_del(it);
+   nd->state_items = NULL;
+   edje_edit_string_list_free(nd->part_list);
+
+   //Append Parts
+   Evas_Object *enventor = base_enventor_get();
+   nd->part_list = enventor_object_parts_list_get(enventor);
+   char *name;
+   part_item_data *data;
+   Edje_Part_Type part_type;
+
+   EINA_LIST_FOREACH(nd->part_list, l, name)
+     {
+        part_type = enventor_object_part_type_get(enventor, name);
+        data = malloc(sizeof(part_item_data));
+        data->text = name;
+        data->type = part_type;
+
+        it = elm_genlist_item_append(nd->genlist,
+                                     nd->part_itc,          /* item class */
+                                     data,                  /* item data */
+                                     group_it,              /* parent */
+                                     ELM_GENLIST_ITEM_NONE, /* item type */
+                                     gl_part_selected_cb,   /* select cb */
+                                     nd);                   /* select cb data 
*/
+        nd->part_items = eina_list_append(nd->part_items, it);
+     }
+}
+
 static char *
 gl_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
                const char *part EINA_UNUSED)
@@ -76,13 +123,24 @@ gl_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
 }
 
 static Evas_Object *
+gl_program_content_get_cb(void *data, Evas_Object *obj, const char *part)
+{
+   if (strcmp("elm.swallow.icon", part)) return NULL;
+
+   Evas_Object *image = elm_image_add(obj);
+   elm_image_file_set(image, EDJE_PATH, "navi_program");
+
+   return image;
+}
+
+static Evas_Object *
 gl_state_content_get_cb(void *data, Evas_Object *obj, const char *part)
 {
    if (strcmp("elm.swallow.icon", part)) return NULL;
 
-   //TODO: Add Icon
    Evas_Object *image = elm_image_add(obj);
    elm_image_file_set(image, EDJE_PATH, "navi_state");
+
    return image;
 }
 
@@ -107,7 +165,6 @@ gl_part_content_get_cb(void *data, Evas_Object *obj, const 
char *part)
    if (strcmp("elm.swallow.icon", part)) return NULL;
    part_item_data *item_data = data;
 
-   //TODO: Add Icon
    Evas_Object *image = elm_image_add(obj);
    const char *group;
 
@@ -146,9 +203,9 @@ gl_part_selected_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 {
    navi_data *nd = data;
    Elm_Object_Item *it = event_info;
+
    //TODO: Search Current Part
 
-   //TODO: Add States List
    states_reload(nd, it);
 }
 
@@ -157,9 +214,9 @@ gl_group_content_get_cb(void *data, Evas_Object *obj, const 
char *part)
 {
    if (strcmp("elm.swallow.icon", part)) return NULL;
 
-   //TODO: Add Icon
    Evas_Object *image = elm_image_add(obj);
    elm_image_file_set(image, EDJE_PATH, "navi_group");
+
    return image;
 }
 
@@ -181,90 +238,81 @@ edc_navigator_group_update(const char *cur_group)
    navi_data *nd = g_nd;
    if (!nd) return;
 
-   if (!config_edc_navigator_get()) return;
-
+   //Cancel item selection if group was not indicated. 
    if (!cur_group)
      {
         Elm_Object_Item *it = elm_genlist_selected_item_get(nd->genlist);
-        elm_genlist_item_selected_set(it, EINA_FALSE);
+        if (it) elm_genlist_item_selected_set(it, EINA_FALSE);
+        return;
+     }
+
+   //If edc_navigator_reload() is not called yet?
+   if (!nd->group_list)
+     {
+        edc_navigator_reload(cur_group);
         return;
      }
 
    Eina_List *l;
    Elm_Object_Item *it;
 
-   //Remove Previous Parts
-   EINA_LIST_FREE(nd->part_items, it)
-      elm_object_item_del(it);
-
-   //Find a current group item
-   Elm_Object_Item *group_item = NULL;
+   //Find a current group item and select it.
+   Elm_Object_Item *group_it = NULL;
+   int cur_group_len = strlen(cur_group);
 
    EINA_LIST_FOREACH(nd->group_items, l, it)
      {
-        group_item = it;
         const char *group_name = elm_object_item_data_get(it);
         if (!group_name) continue;
 
         if (!strcmp(group_name, cur_group) &&
-            strlen(group_name) == strlen(cur_group))
+            (strlen(group_name) == cur_group_len))
           {
              elm_genlist_item_selected_set(it, EINA_TRUE);
-             group_item = it;
+             group_it = it;
              break;
           }
      }
 
-   if (!group_item) return;
+   //We couldn't find a group... ?
+   if (!group_it) return;
 
-   //Append Parts
-   Evas_Object *enventor = base_enventor_get();
-   edje_edit_string_list_free(nd->part_list);
-   nd->part_list = enventor_object_parts_list_get(enventor);
-   char *name;
-   part_item_data *data;
-   Edje_Part_Type part_type;
-
-   EINA_LIST_FOREACH(nd->part_list, l, name)
-     {
-        part_type = enventor_object_part_type_get(enventor, name);
-        data = malloc(sizeof(part_item_data));
-        data->text = name;
-        data->type = part_type;
-
-        it = elm_genlist_item_append(nd->genlist,
-                                     nd->part_itc,          /* item class */
-                                     data,
-                                     group_item,            /* parent */
-                                     ELM_GENLIST_ITEM_NONE, /* item type */
-                                     gl_part_selected_cb,   /* select cb */
-                                     nd);                   /* select cb data 
*/
-        nd->part_items = eina_list_append(nd->part_items, it);
-     }
+   parts_reload(nd, group_it);
 
    //Append Programs
 }
 
 void
-edc_navigator_reload(void)
+edc_navigator_reload(const char *cur_group)
 {
-   if (!config_edc_navigator_get()) return;
-
    navi_data *nd = g_nd;
    if (!nd) return;
 
-   //Reset Navigator resource
+   //Reset Navigator resource.
+
+   //FIXME: Maybe we could optimize if group list hasn't been changed.
    nd->group_items = eina_list_free(nd->group_items);
+   nd->part_items = NULL;
+   nd->state_items = NULL;
+   nd->program_items = NULL;
+
    elm_genlist_clear(nd->genlist);
    edje_file_collection_list_free(nd->group_list);
+
+   if (!cur_group)
+     {
+        nd->group_list = NULL;
+        return;
+     }
+
    nd->group_list = edje_file_collection_list(config_output_path_get());
 
+   //Update Group
    Eina_List *l;
    char *name;
    Elm_Object_Item *it;
-   const char *cur_group = stats_group_name_get();
+   int cur_group_len = strlen(cur_group);
 
-   //Update Group
    EINA_LIST_FOREACH(nd->group_list, l, name)
      {
         it = elm_genlist_item_append(nd->genlist,
@@ -277,10 +325,12 @@ edc_navigator_reload(void)
 
         nd->group_items = eina_list_append(nd->group_items, it);
 
-        //Update Parts only if current group
-        if (cur_group && !strcmp(name, cur_group) &&
-            (strlen(name) == strlen(cur_group)))
-          edc_navigator_group_update(cur_group);
+        //Update a current group
+        if ((cur_group && !strcmp(name, cur_group)) &&
+            (strlen(name) == cur_group_len))
+          {
+             edc_navigator_group_update(cur_group);
+          }
      }
 }
 
@@ -325,6 +375,14 @@ edc_navigator_init(Evas_Object *parent)
 
    nd->state_itc = itc;
 
+   //Program Item Class
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_text_get_cb;
+   itc->func.content_get = gl_program_content_get_cb;
+
+   nd->program_itc = itc;
+
    nd->genlist = genlist;
 
    return genlist;
@@ -339,12 +397,18 @@ edc_navigator_term(void)
    eina_list_free(nd->state_items);
    eina_list_free(nd->part_items);
    eina_list_free(nd->group_items);
+   eina_list_free(nd->program_items);
+
    edje_file_collection_list_free(nd->group_list);
    edje_edit_string_list_free(nd->part_list);
    edje_edit_string_list_free(nd->state_list);
+   edje_edit_string_list_free(nd->program_list);
+
    elm_genlist_item_class_free(nd->group_itc);
    elm_genlist_item_class_free(nd->part_itc);
    elm_genlist_item_class_free(nd->state_itc);
+   elm_genlist_item_class_free(nd->program_itc);
+
    free(nd);
    g_nd = NULL;
 }
diff --git a/src/include/base_gui.h b/src/include/base_gui.h
index 50d22c5..4543d5f 100644
--- a/src/include/base_gui.h
+++ b/src/include/base_gui.h
@@ -1,6 +1,8 @@
 #include "panes.h"
 #include "edc_navigator.h"
 
+#define EDC_NAVIGATOR_UPDATE_TIME 0.5
+
 Eina_Bool base_gui_init(void);
 void base_gui_show(void);
 Evas_Object *base_win_get(void);
diff --git a/src/include/edc_navigator.h b/src/include/edc_navigator.h
index 18f65c9..9e11b33 100644
--- a/src/include/edc_navigator.h
+++ b/src/include/edc_navigator.h
@@ -1,4 +1,4 @@
 Evas_Object *edc_navigator_init(Evas_Object *parent);
 void edc_navigator_term(void);
-void edc_navigator_reload(void);
+void edc_navigator_reload(const char *cur_group);
 void edc_navigator_group_update(const char *cur_group);

-- 


Reply via email to