From: Jehun Lim Date: Mon, 20 Jul 2015 01:55:37 +0000 (+0900) Subject: music: draw content list area X-Git-Tag: accepted/tizen/tv/20150728.070555~52 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fa748388d964e7a1bdd5f54798d8ba7a94b22bd1;p=profile%2Ftv%2Fapps%2Fnative%2Fair_mediahub.git music: draw content list area Change-Id: I9e86ff43849a19c2310b4a6254f6da5a69a421cb Signed-off-by: Jehun Lim --- diff --git a/include/layout/music.h b/include/layout/music.h index 89ac040..ea3efde 100644 --- a/include/layout/music.h +++ b/include/layout/music.h @@ -21,4 +21,6 @@ #define GRP_MUSIC_LAYOUT "group.music_layout" +#define STYLE_GRID_SONG_ITEM "song_item" + #endif /* __AIR_MEDIAHUB_LAYOUT_MUSIC_H__ */ diff --git a/res/edc/layout/music.edc b/res/edc/layout/music.edc index e2b0788..18a60da 100644 --- a/res/edc/layout/music.edc +++ b/res/edc/layout/music.edc @@ -16,4 +16,5 @@ group { name: GRP_MUSIC_LAYOUT; + inherit: GRP_MOVIE_LAYOUT; } diff --git a/src/layout/music.c b/src/layout/music.c index 4a95782..e673555 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -15,20 +15,165 @@ */ #include +#include #include +#include +#include #include +#include #include "define.h" +#include "view.h" +#include "data/mediadata.h" +#include "util/listmgr.h" +#include "util/util.h" + +#define LIST_MEDIA_COND "media_type=3" + +#define TEXT_NOCONTENT "No Music" + +#define GRID_PADDING 26 +#define GRID_ITEM_X (488 + GRID_PADDING) +#define GRID_ITEM_Y (134 + GRID_PADDING) +#define GRID_NUM_ITEM 4 + +#define BOX_PADDING (62 - GRID_PADDING) struct _priv { Evas_Object *base; Evas_Object *layout; + Evas_Object *menu_btn; layoutmgr *lmgr; + + struct listmgr *listmgr; + struct listmgr_data *ldata; + + struct mediadata *md; + + Eina_List *media_list; +}; + +static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) +{ + app_media *am; + app_media_info *info; + + 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); + + return NULL; +} + +static Evas_Object *_grid_content_get(void *data, + Evas_Object *obj, const char *part) +{ + Evas_Object *image; + app_media *am; + app_media_info *info; + + if (!data) + return NULL; + + am = data; + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get media info"); + return NULL; + } + + image = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) { + image = util_add_image(obj, info->thumbnail_path); + if (!image) { + _ERR("failed to create image object"); + return NULL; + } + + evas_object_show(image); + } + + return image; +} + +static struct grid_class _gclass = { + .item_style = STYLE_GRID_SONG_ITEM, + .text_get = _grid_text_get, + .content_get = _grid_content_get }; +static struct listmgr_data *_create_listmgr_data(struct _priv *priv) +{ + struct listmgr_data *data; + struct grid_ops *gops; + + data = calloc(1, sizeof(*data)); + if (!data) + goto err; + + data->menu_btn = priv->menu_btn; + + data->grid_item_x = GRID_ITEM_X; + data->grid_item_y = GRID_ITEM_Y; + data->grid_num_item = GRID_NUM_ITEM; + data->box_padding = BOX_PADDING; + + gops = calloc(1, sizeof(*gops)); + if (!gops) + goto err; + + gops->gclass = &_gclass; + gops->selected_cb = NULL; + gops->ops_data = priv; + + data->gops = gops; + + return data; + +err: + _ERR("failed to allocate memory"); + return NULL; +} + +static void _update_list_area(struct _priv *priv) +{ + Eina_List *list; + + if (priv->media_list) + return; + + list = mediadata_get_list(priv->md, E_LIST_NAME); + if (!list) { + elm_object_part_text_set(priv->layout, + PART_NOCONTENT, TEXT_NOCONTENT); + return; + } + + if (!listmgr_update_content_list(priv->listmgr, list)) + _ERR("failed to update list area"); + + priv->media_list = list; +} + static bool _create(layoutmgr *lmgr, void *data) { + struct listmgr *listmgr; + struct listmgr_data *ldata; + struct mediadata *md; struct _priv *priv; Evas_Object *base, *layout; @@ -37,39 +182,80 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } + if (!data) { + _ERR("invalid argument"); + return false; + } + priv = calloc(1, sizeof(*priv)); if (!priv) { _ERR("failed to allocate priv"); return false; } + priv->menu_btn = (Evas_Object *)data; + base = layoutmgr_get_base(lmgr); if (!base) { _ERR("failed to get base object"); - free(priv); - return false; + goto err; } layout = elm_layout_add(base); if (!layout) { _ERR("failed to create layout"); - free(priv); - return false; + goto err; } if (!elm_layout_file_set(layout, EDJEFILE, GRP_MUSIC_LAYOUT)) { _ERR("failed to set layout file"); - evas_object_del(layout); - free(priv); + goto err2; + } + + ldata = _create_listmgr_data(priv); + if (!ldata) { + _ERR("failed to create listmgr data"); + goto err2; + } + + listmgr = listmgr_create(layout, (void *)ldata); + if (!listmgr) { + _ERR("failed to create listmgr"); + goto err3; + } + + md = mediadata_create(LIST_MEDIA_COND, E_SOURCE_ALL, E_SORT_NAME); + if (!md) { + _ERR("failed to create mediadata"); + listmgr_destroy(listmgr); + goto err3; } priv->base = base; priv->layout = layout; priv->lmgr = lmgr; + priv->listmgr = listmgr; + priv->ldata = ldata; + priv->md = md; layoutmgr_set_layout_data(lmgr, LAYOUT_MUSIC, priv); + if (!listmgr_draw_list_area(listmgr)) { + _ERR("failed to draw list area"); + mediadata_destroy(md); + listmgr_destroy(listmgr); + goto err3; + } + return true; + +err3: + free(ldata); +err2: + evas_object_del(layout); +err: + free(priv); + return false; } static void _destroy(void *layout_data) @@ -83,7 +269,15 @@ static void _destroy(void *layout_data) priv = layout_data; + mediadata_free_list(priv->media_list); + mediadata_destroy(priv->md); + + listmgr_destroy(priv->listmgr); + free(priv->ldata->gops); + free(priv->ldata); + evas_object_del(priv->layout); + free(priv); } @@ -120,6 +314,33 @@ static void _hide(void *layout_data) static void _update(void *layout_data, int update_type, void *data) { + struct _priv *priv; + int index; + + if (!layout_data) { + _ERR("failed to get layout data"); + return; + } + + priv = layout_data; + + switch (update_type) { + case UPDATE_CONTENT: + _update_list_area(priv); + break; + case UPDATE_FOCUS: + if (!data) { + _ERR("invalid argument"); + return; + } + + index = *(int *)data; + listmgr_update_focus_item(priv->listmgr, index); + + break; + default: + break; + } } static layout_class _lclass = {