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