edc_navigator: support program list

This commit is contained in:
Hermet Park 2016-02-29 17:24:49 +09:00
parent 647dbde8ca
commit d09c073fb0
6 changed files with 210 additions and 59 deletions

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 204 B

View File

@ -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,63 +89,6 @@ 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)
{
const char *text = data;
return strdup(text);
}
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)
{
@ -144,6 +100,140 @@ gl_state_content_get_cb(void *data, Evas_Object *obj, const char *part)
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
gl_program_selected_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info)
{
Elm_Object_Item *it = event_info;
//TODO: Search Current Program
}
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;
char *name;
Eina_List *l;
Elm_Object_Item *it;
EINA_LIST_FOREACH(nd->program_list, l, name)
{
it = elm_genlist_item_append(nd->genlist,
nd->program_itc, /* item class */
name, /* item data */
programs_it, /* parent */
ELM_GENLIST_ITEM_NONE, /* item type */
gl_program_selected_cb,/* select cb */
nd); /* select cb data */
nd->program_items = eina_list_append(nd->program_items, it);
}
}
static void
sub_programs_remove(navi_data *nd)
{
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 void
gl_programs_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
{
navi_data *nd = g_nd;
if (!nd) return;
Elm_Object_Item *it = data;
if (nd->programs_it == it) nd->programs_it = NULL;
}
/* 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_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_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);

View File

@ -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 {

View File

@ -315,6 +315,13 @@ err:
return EINA_FALSE;
}
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,