From f5feab4ca78b017d329f0f8329acbe5387f40171 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 19 Aug 2015 16:37:59 +0900 Subject: [PATCH] action_menu: add updating favorite area Change-Id: I41a633cea8faca74274e9e99c80a836edc498783 Signed-off-by: Jehun Lim --- src/view/action_menu.c | 208 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 206 insertions(+), 2 deletions(-) diff --git a/src/view/action_menu.c b/src/view/action_menu.c index 6b6d004..552ea19 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -51,6 +51,8 @@ struct _priv { Evas_Object *tv_btn; Evas_Object *menu_btn[MAX_NUM_MENU]; Evas_Object *grid; + + Eina_List *favorite_list; }; struct _menu_info { @@ -156,6 +158,111 @@ static input_handler _handler = { .mouse_move = _mouse_move_cb }; +static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) +{ + app_media *am; + app_media_info *info; + char buf[32]; + + if (!data) + return NULL; + + am = data; + + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get media info"); + return NULL; + } + + if (!strcmp(part, PART_ELM_TEXT_TITLE)) + return strdup(info->title); + else if (!strcmp(part, PART_ELM_TEXT_ARTIST)) + return strdup(info->audio->artist); + else if (!strcmp(part, PART_ELM_TEXT_ALBUM)) + return strdup(info->audio->album); + else if (!strcmp(part, PART_ELM_TEXT_PLAYTIME)) { + if (info->media_type != MEDIA_CONTENT_TYPE_VIDEO) + return NULL; + + util_time_string(buf, sizeof(buf), + info->video->duration, false); + return strdup(buf); + } + + return NULL; +} + +static Evas_Object *_grid_content_get(void *data, + Evas_Object *obj, const char *part) +{ + Evas_Object *content; + app_media *am; + app_media_info *info; + struct color_data bg; + + if (!data) + return NULL; + + am = data; + + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get media info"); + return NULL; + } + + content = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) { + content = util_add_image(obj, info->thumbnail_path); + if (!content) + goto err; + + evas_object_show(content); + } else if (!strcmp(part, PART_ELM_SWALLOW_VIDEO)) { + if (info->media_type != MEDIA_CONTENT_TYPE_VIDEO) + return NULL; + + content = util_add_image(obj, IMAGE_THUMBNAIL_PLAY); + if (!content) + goto err; + + evas_object_show(content); + } else if (!strcmp(part, PART_ELM_SWALLOW_TEXTBG)) { + content = evas_object_rectangle_add(obj); + if (!content) + goto err; + + app_contents_get_color(info->title, NULL, &bg); + evas_object_color_set(content, bg.r, bg.g, bg.b, bg.a); + + evas_object_show(content); + } + + return content; + +err: + _ERR("failed to create evas object"); + return NULL; +} + +Elm_Gengrid_Item_Class *_get_grid_item_class(int type) +{ + Elm_Gengrid_Item_Class *ic; + + ic = elm_gengrid_item_class_new(); + if (!ic) { + _ERR("failed to create gengrid item class"); + return NULL; + } + + ic->func.text_get = _grid_text_get; + ic->func.content_get = _grid_content_get; + ic->item_style = content_info[type].style; + + return ic; +} + static bool _check_movie_type(app_media_info *info) { return strcmp(info->video->copyright, VIDEO_COPYRIGHT); @@ -186,6 +293,75 @@ static int _get_content_type(app_media_info *info) return type; } +static void _free_favorite_list(Eina_List *list) +{ + app_media *am; + + EINA_LIST_FREE(list, am) + app_media_destroy(am); +} + +static void _favorite_list_foreach(gpointer data, gpointer user_data) +{ + media_info_h media; + app_media *am; + Eina_List **l; + int r; + char *id; + + if (!data || !user_data) { + _ERR("invalid argument"); + return; + } + + id = (char *)data; + l = (Eina_List **)user_data; + + r = media_info_get_media_from_db(id, &media); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get media handle"); + return; + } + + am = app_media_create(media); + if (!am) { + _ERR("failed to create app media"); + media_info_destroy(media); + return; + } + + *l = eina_list_append(*l, am); +} + +static Eina_List *_get_favorite_list(int type) +{ + GList *id_list; + Eina_List *list; + int r; + + r = media_content_connect(); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return NULL; + } + + id_list = NULL; + if (app_contents_get_favorite_list(type, &id_list) + != APP_CONTENTS_ERROR_NONE) { + _ERR("failed to get favorite list"); + return NULL; + } + + list = NULL; + g_list_foreach(id_list, _favorite_list_foreach, &list); + + app_contents_free_favorite_list(id_list); + + media_content_disconnect(); + + return list; +} + static bool _draw_livetv_btn(struct _priv *priv) { Evas_Object *btn; @@ -247,7 +423,8 @@ static bool _draw_menu_area(struct _priv *priv) inputmgr_add_callback(btn, ACTION_MENU_BTN, &_handler, priv); - elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(btn, priv->grid, + ELM_FOCUS_DOWN); priv->menu_btn[i] = btn; } @@ -293,7 +470,31 @@ static bool _draw_favorite_area(struct _priv *priv) static void _update_favorite_area(struct _priv *priv, int type) { - /* It will implemented later */ + + Elm_Gengrid_Item_Class *ic; + Elm_Object_Item *it; + Eina_List *favorite_l, *l; + app_media *am; + + elm_gengrid_clear(priv->grid); + + elm_gengrid_item_size_set(priv->grid, + elm_config_scale_get() * content_info[type].grid_x, + elm_config_scale_get() * content_info[type].grid_y); + + ic = _get_grid_item_class(type); + + favorite_l = _get_favorite_list(content_info[type].app_contents_type); + + EINA_LIST_FOREACH(favorite_l, l, am) { + it = elm_gengrid_item_append(priv->grid, ic, am, NULL, NULL); + + elm_object_item_data_set(it, am); + } + + elm_gengrid_item_class_free(ic); + + priv->favorite_list = favorite_l; } static bool _draw_items(struct _priv *priv) @@ -457,6 +658,9 @@ static void _destroy(void *view_data) for (i = 0; i < MAX_NUM_MENU; i++) inputmgr_remove_callback(priv->menu_btn[i], &_handler); + if (priv->favorite_list) + _free_favorite_list(priv->favorite_list); + evas_object_del(priv->base); free(priv); -- 2.7.4