hermet pushed a commit to branch master.

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

commit d09c073fb0bbcfe4835f12cdeeb8e12e53797948
Author: Hermet Park <her...@hermet.pe.kr>
Date:   Mon Feb 29 17:24:49 2016 +0900

    edc_navigator: support program list
---
 data/themes/default/images.edc              |   2 +
 data/themes/default/images/navi_program.png | Bin 0 -> 548 bytes
 data/themes/default/images/navi_state.png   | Bin 205 -> 204 bytes
 src/bin/edc_navigator.c                     | 217 +++++++++++++++++++++++-----
 src/lib/enventor_object.eo                  |   3 +
 src/lib/enventor_smart.c                    |   7 +
 6 files changed, 190 insertions(+), 39 deletions(-)

diff --git a/data/themes/default/images.edc b/data/themes/default/images.edc
index 53f2b7d..60d7036 100644
--- a/data/themes/default/images.edc
+++ b/data/themes/default/images.edc
@@ -30,6 +30,7 @@ images {
    image: "navi_textblock.png" COMP;
    image: "navi_spacer.png" COMP;
    image: "navi_state.png" COMP;
+   image: "navi_program.png" COMP;
    image: "navi_unknown.png" COMP;
 }
 
@@ -74,6 +75,7 @@ ICON_GROUP("navi_text", "navi_text.png")
 ICON_GROUP("navi_textblock", "navi_textblock.png")
 ICON_GROUP("navi_spacer", "navi_spacer.png")
 ICON_GROUP("navi_state", "navi_state.png")
+ICON_GROUP("navi_program", "navi_program.png")
 ICON_GROUP("navi_unknown", "navi_unknown.png")
 
 #undef ICON_GROUP
diff --git a/data/themes/default/images/navi_program.png 
b/data/themes/default/images/navi_program.png
new file mode 100644
index 0000000..b5ed263
Binary files /dev/null and b/data/themes/default/images/navi_program.png differ
diff --git a/data/themes/default/images/navi_state.png 
b/data/themes/default/images/navi_state.png
index 1a4d229..4eb3038 100644
Binary files a/data/themes/default/images/navi_state.png and 
b/data/themes/default/images/navi_state.png differ
diff --git a/src/bin/edc_navigator.c b/src/bin/edc_navigator.c
index fba395c..9a1f63a 100644
--- a/src/bin/edc_navigator.c
+++ b/src/bin/edc_navigator.c
@@ -3,6 +3,7 @@
 typedef struct edc_navigator_s
 {
    Evas_Object *genlist;
+   Elm_Object_Item *programs_it;
 
    Eina_List *group_items;                 //group object item
    Eina_List *part_items;                  //part object item
@@ -17,6 +18,7 @@ typedef struct edc_navigator_s
    Elm_Genlist_Item_Class *group_itc;
    Elm_Genlist_Item_Class *part_itc;
    Elm_Genlist_Item_Class *state_itc;
+   Elm_Genlist_Item_Class *programs_itc;
    Elm_Genlist_Item_Class *program_itc;
 
 } navi_data;
@@ -35,6 +37,17 @@ gl_part_selected_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_info);
 /*****************************************************************************/
 /* Internal method implementation                                            */
 /*****************************************************************************/
+
+static char *
+gl_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
+               const char *part EINA_UNUSED)
+{
+   const char *text = data;
+   return strdup(text);
+}
+
+/* State Related */
+
 static void
 gl_state_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info)
 {
@@ -76,74 +89,151 @@ states_reload(navi_data *nd, Elm_Object_Item *part_it)
      }
 }
 
+static Evas_Object *
+gl_state_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_state");
+
+   return image;
+}
+
+/* Program Related */
+
+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_state");
+
+   return image;
+}
+
+
 static void
-parts_reload(navi_data *nd, Elm_Object_Item *group_it)
+gl_program_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info)
 {
-   Eina_List *l;
-   Elm_Object_Item *it;
+   Elm_Object_Item *it = event_info;
 
-   //Remove Previous Parts
+   //TODO: Search Current Program
+}
 
-   //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);
+static void
+sub_programs_reload(navi_data *nd, Elm_Object_Item *programs_it)
+{
+   const Eina_List *programs = elm_genlist_item_subitems_get(programs_it);
+
+   //We already reloaded items
+   if (programs) return;
 
-   //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 *l;
+   Elm_Object_Item *it;
 
-   EINA_LIST_FOREACH(nd->part_list, l, name)
+   EINA_LIST_FOREACH(nd->program_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 */
+                                     nd->program_itc,       /* item class */
+                                     name,                  /* item data */
+                                     programs_it,           /* parent */
                                      ELM_GENLIST_ITEM_NONE, /* item type */
-                                     gl_part_selected_cb,   /* select cb */
+                                     gl_program_selected_cb,/* select cb */
                                      nd);                   /* select cb data 
*/
-        nd->part_items = eina_list_append(nd->part_items, it);
+        nd->program_items = eina_list_append(nd->program_items, it);
      }
 }
 
-static char *
-gl_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED,
-               const char *part EINA_UNUSED)
+static void
+sub_programs_remove(navi_data *nd)
 {
-   const char *text = data;
-   return strdup(text);
+   if (!nd->programs_it) return;
+
+   Eina_List *l;
+   Elm_Object_Item *it;
+   EINA_LIST_FREE(nd->program_items, it) elm_object_item_del(it);
+   edje_edit_string_list_free(nd->program_list);
+   nd->program_list = NULL;
 }
 
-static Evas_Object *
-gl_program_content_get_cb(void *data, Evas_Object *obj, const char *part)
+static void
+gl_programs_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
 {
-   if (strcmp("elm.swallow.icon", part)) return NULL;
+   navi_data *nd = g_nd;
+   if (!nd) return;
 
-   Evas_Object *image = elm_image_add(obj);
-   elm_image_file_set(image, EDJE_PATH, "navi_program");
+   Elm_Object_Item *it = data;
+   if (nd->programs_it == it) nd->programs_it = NULL;
+}
 
-   return image;
+/* Programs Related */
+
+static void
+gl_programs_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 Programs
+
+   sub_programs_reload(nd, it);
 }
 
+static void
+programs_reload(navi_data *nd, Elm_Object_Item *group_it)
+{
+   //FIXME: Maybe we could optimize if programs list hasn't been changed.
+   sub_programs_remove(nd);
+
+   //Append Parts
+   Evas_Object *enventor = base_enventor_get();
+   nd->program_list = enventor_object_programs_list_get(enventor);
+
+   //FIXME: Maybe we could optimize if programs list hasn't been changed.
+   elm_object_item_del(nd->programs_it);
+   nd->programs_it = NULL;
+
+   if (!nd->program_list) return;
+
+   //Programs Item
+   nd->programs_it =
+      elm_genlist_item_append(nd->genlist,
+                              nd->programs_itc,        /* item class */
+                              NULL,                    /* item data */
+                              group_it,                /* parent */
+                              ELM_GENLIST_ITEM_NONE,   /* item type */
+                              gl_programs_selected_cb, /* select cb */
+                              nd);                     /* select cb data */
+   elm_object_item_data_set(nd->programs_it, nd->programs_it);
+}
+
+static char *
+gl_programs_text_get_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                        const char *part EINA_UNUSED)
+{
+   return strdup("PROGRAMS");
+}
+
+
 static Evas_Object *
-gl_state_content_get_cb(void *data, Evas_Object *obj, const char *part)
+gl_programs_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_state");
+   elm_image_file_set(image, EDJE_PATH, "navi_program");
 
    return image;
 }
 
+
+/* Part Related */
+
 static void
 gl_part_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
 {
@@ -209,6 +299,46 @@ gl_part_selected_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_info)
    states_reload(nd, 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);
+     }
+}
+
+/* Group Related */
+
 static Evas_Object *
 gl_group_content_get_cb(void *data, Evas_Object *obj, const char *part)
 {
@@ -278,8 +408,7 @@ edc_navigator_group_update(const char *cur_group)
    if (!group_it) return;
 
    parts_reload(nd, group_it);
-
-   //Append Programs
+   programs_reload(nd, group_it);
 }
 
 void
@@ -375,6 +504,15 @@ edc_navigator_init(Evas_Object *parent)
 
    nd->state_itc = itc;
 
+   //Programs Item Class
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_programs_text_get_cb;
+   itc->func.content_get = gl_programs_content_get_cb;
+   itc->func.del = gl_programs_del_cb;
+
+   nd->programs_itc = itc;
+
    //Program Item Class
    itc = elm_genlist_item_class_new();
    itc->item_style = "default";
@@ -407,6 +545,7 @@ edc_navigator_term(void)
    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->programs_itc);
    elm_genlist_item_class_free(nd->program_itc);
 
    free(nd);
diff --git a/src/lib/enventor_object.eo b/src/lib/enventor_object.eo
index 9ceb16d..9fb7322 100644
--- a/src/lib/enventor_object.eo
+++ b/src/lib/enventor_object.eo
@@ -113,6 +113,9 @@ class Enventor.Object (Elm.Widget, Efl.File) {
             @in type: Enventor_Path_Type;
          }
       }
+      programs_list_get {
+         return: Eina_List *;
+      }
       part_states_list_get {
          return: Eina_List *;
          params {
diff --git a/src/lib/enventor_smart.c b/src/lib/enventor_smart.c
index be3c0e8..b30751d 100644
--- a/src/lib/enventor_smart.c
+++ b/src/lib/enventor_smart.c
@@ -316,6 +316,13 @@ err:
 }
 
 EOLIAN static Eina_List *
+_enventor_object_programs_list_get(Eo *obj EINA_UNUSED,
+                                   Enventor_Object_Data *pd EINA_UNUSED)
+{
+   return view_programs_list_get(VIEW_DATA);
+}
+
+EOLIAN static Eina_List *
 _enventor_object_part_states_list_get(Eo *obj EINA_UNUSED,
                                       Enventor_Object_Data *pd EINA_UNUSED,
                                       const char *part)

-- 


Reply via email to