From: Jehun Lim Date: Thu, 17 Sep 2015 10:50:39 +0000 (+0900) Subject: music: add album and artist view mode X-Git-Tag: accepted/tizen/tv/20150920.232737~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F97%2F48297%2F1;p=profile%2Ftv%2Fapps%2Fnative%2Fair_mediahub.git music: add album and artist view mode Change-Id: Iacf502689f966ea9f64de1c13dac9b5dabbd6d72 Signed-off-by: Jehun Lim --- diff --git a/include/grid/grid.h b/include/grid/grid.h index a03a873..e1fb94e 100644 --- a/include/grid/grid.h +++ b/include/grid/grid.h @@ -89,4 +89,18 @@ struct grid_data *get_music_grid_data(int type); #define MOVIE_GENRE_ITEM_NUM GALLERY_EVENT_ITEM_NUM #define MOVIE_GENRE_GRID_PADDING GALLERY_EVENT_GRID_PADDING +#define STYLE_MUSIC_ALBUM "album_item" +#define MUSIC_ALBUM_ITEM_PADDING 26 +#define MUSIC_ALBUM_ITEM_X (212 + MUSIC_ALBUM_ITEM_PADDING) +#define MUSIC_ALBUM_ITEM_Y (294 + MUSIC_ALBUM_ITEM_PADDING) +#define MUSIC_ALBUM_ITEM_NUM 2 +#define MUSIC_ALBUM_GRID_PADDING (62 - MUSIC_ALBUM_ITEM_PADDING) + +#define STYLE_MUSIC_ARTIST "album_item" +#define MUSIC_ARTIST_ITEM_PADDING MUSIC_ALBUM_ITEM_PADDING +#define MUSIC_ARTIST_ITEM_X MUSIC_ALBUM_ITEM_X +#define MUSIC_ARTIST_ITEM_Y MUSIC_ALBUM_ITEM_Y +#define MUSIC_ARTIST_ITEM_NUM MUSIC_ALBUM_ITEM_NUM +#define MUSIC_ARTIST_GRID_PADDING MUSIC_ALBUM_GRID_PADDING + #endif /* __AIR_MEDIAHUB_GRID_H__ */ diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index fb6f153..2b9e6fd 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -15,14 +15,11 @@ */ group { - name: "elm/gengrid/item/movie_item/default"; + name: "elm/gengrid/item/album_item/default"; data.item: "selectraise" "on"; data.item: "texts" "elm.text.title"; - data.item: "contents" "elm.swallow.thumbnail elm.swallow.favorite elm.swallow.textbg"; + data.item: "contents" "elm.swallow.thumbnail elm.swallow.textbg"; data.item: "focus_highlight" "on"; - images { - image: IMAGE_PREVIEW_PLAY COMP; - } parts { part { name: "elm.padding.bottom_right"; @@ -111,34 +108,6 @@ group { } } part { - name: "default_image"; - type: IMAGE; - scale: 1; - description { - state: "default" 0.0; - rel1 { - to: "defaultbg"; - relative: 0.5 0.5; - } - rel2 { - to: "defaultbg"; - relative: 0.5 0.5; - } - image.normal: IMAGE_PREVIEW_PLAY; - min: 80 80; - fixed: 1 1; - map { - perspective_on: 1; - perspective: "map"; - } - } - description { - state: "selected" 0.0; - inherit: "default" 0.0; - map.on: 1; - } - } - part { name: "padding_favorite"; type: SPACER; scale: 1; @@ -433,6 +402,103 @@ group { name: "focus,in,anim"; action: STATE_SET "selected" 0.0; target: "defaultbg"; + target: PART_ELM_SWALLOW_THUMBNAIL; + target: PART_ELM_SWALLOW_FAVORITE; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "defaultbg_text"; + transition: TRANSITION_FOCUS; + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: PART_ELM_TEXT_TITLE; + after: "focus,out,anim"; + } + program { + name: "focus,out,anim"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "defaultbg_text"; + transition: TRANSITION_FOCUS; + after: "focus,out,anim,2"; + } + program { + name: "focus,out,anim,2"; + action: STATE_SET "default" 0.0; + target: PART_ELM_SWALLOW_THUMBNAIL; + target: PART_ELM_SWALLOW_FAVORITE; + target: "defaultbg"; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "defaultbg_text"; + } + } +} + +group { + name: "elm/gengrid/item/movie_item/default"; + inherit: "elm/gengrid/item/album_item/default"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.title"; + data.item: "contents" "elm.swallow.thumbnail elm.swallow.favorite elm.swallow.textbg"; + data.item: "focus_highlight" "on"; + images { + image: IMAGE_PREVIEW_PLAY COMP; + } + parts { + part { + name: "default_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "defaultbg"; + relative: 0.5 0.5; + } + rel2 { + to: "defaultbg"; + relative: 0.5 0.5; + } + image.normal: IMAGE_PREVIEW_PLAY; + min: 80 80; + fixed: 1 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "defaultbg_text"; + target: PART_ELM_TEXT_TITLE; + after: "focus,in,anim"; + } + program { + name: "focus,in,anim"; + action: STATE_SET "selected" 0.0; + target: "defaultbg"; target: "default_image"; target: PART_ELM_SWALLOW_THUMBNAIL; target: PART_ELM_SWALLOW_FAVORITE; diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index 7ef538f..dcdc70e 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -29,7 +29,7 @@ #include "grid/grid.h" #include "util/util.h" -static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) +static char *_media_text_get(void *data, Evas_Object *obj, const char *part) { app_media *am; app_media_info *info; @@ -55,7 +55,7 @@ static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) return NULL; } -static Evas_Object *_grid_content_get(void *data, +static Evas_Object *_media_content_get(void *data, Evas_Object *obj, const char *part) { Evas_Object *eo; @@ -97,7 +97,67 @@ static Evas_Object *_grid_content_get(void *data, return eo; } -static Eina_List *_get_item_list(struct datamgr *dmgr) +static char *_album_text_get(void *data, Evas_Object *obj, const char *part) +{ + struct album_info *ai; + + if (!data) + return NULL; + + ai = data; + + return strdup(ai->name); +} + +static char *_artist_text_get(void *data, Evas_Object *obj, const char *part) +{ + struct album_info *ai; + + if (!data) + return NULL; + + ai = data; + + return strdup(ai->artist); +} + +static Evas_Object *_album_content_get(void *data, Evas_Object *obj, + const char *part) +{ + Evas_Object *eo; + struct album_info *ai; + struct color_data bg; + + if (!data) + return NULL; + + ai = data; + + eo = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) { + eo = util_add_image(obj, ai->album_art); + if (!eo) { + _ERR("failed to create image object"); + return NULL; + } + } else if (!strcmp(part, PART_ELM_SWALLOW_TEXTBG)) { + eo = evas_object_rectangle_add(obj); + if (!eo) { + _ERR("failed to create rectangle object"); + return NULL; + } + + app_contents_get_color(ai->name, NULL, &bg); + evas_object_color_set(eo, bg.r, bg.g, bg.b, bg.a); + } + + if (eo) + evas_object_show(eo); + + return eo; +} + +static Eina_List *_get_song_list(struct datamgr *dmgr) { if (!dmgr) { _ERR("invalid argument"); @@ -107,6 +167,26 @@ static Eina_List *_get_item_list(struct datamgr *dmgr) return dmgr->ops->get_group(dmgr->handle, E_MEDIA_NAME); } +static Eina_List *_get_album_list(struct datamgr *dmgr) +{ + if (!dmgr) { + _ERR("invalid argument"); + return NULL; + } + + return dmgr->ops->get_group(dmgr->handle, E_ALBUM_NAME); +} + +static Eina_List *_get_artist_list(struct datamgr *dmgr) +{ + if (!dmgr) { + _ERR("invalid argument"); + return NULL; + } + + return dmgr->ops->get_group(dmgr->handle, E_ALBUM_ARTIST); +} + static void _free_item_list(struct datamgr *dmgr, Eina_List *list) { if (!dmgr) { @@ -176,8 +256,18 @@ static void _selected_cb(void *data, Elm_Object_Item *it) static struct grid_class _gclass[] = { [E_MUSIC_SONG] = { .item_style = STYLE_MUSIC_SONG, - .text_get = _grid_text_get, - .content_get = _grid_content_get + .text_get = _media_text_get, + .content_get = _media_content_get + }, + [E_MUSIC_ALBUM] = { + .item_style = STYLE_MUSIC_ALBUM, + .text_get = _album_text_get, + .content_get = _album_content_get + }, + [E_MUSIC_ARTIST] = { + .item_style = STYLE_MUSIC_ARTIST, + .text_get = _artist_text_get, + .content_get = _album_content_get }, /* Other view mode class will be added later */ }; @@ -189,11 +279,29 @@ static struct grid_data _gdata[] = { .item_num = MUSIC_SONG_ITEM_NUM, .grid_padding = MUSIC_SONG_GRID_PADDING, .gclass = &_gclass[E_MUSIC_SONG], - .get_item_list = _get_item_list, + .get_item_list = _get_song_list, .free_item_list = _free_item_list, .key_down_cb = _key_down_cb, .selected_cb = _selected_cb }, + [E_MUSIC_ALBUM] = { + .item_x = MUSIC_ALBUM_ITEM_X, + .item_y = MUSIC_ALBUM_ITEM_Y, + .item_num = MUSIC_ALBUM_ITEM_NUM, + .grid_padding = MUSIC_ALBUM_GRID_PADDING, + .gclass = &_gclass[E_MUSIC_ALBUM], + .get_item_list = _get_album_list, + .free_item_list = _free_item_list, + }, + [E_MUSIC_ARTIST] = { + .item_x = MUSIC_ARTIST_ITEM_X, + .item_y = MUSIC_ARTIST_ITEM_Y, + .item_num = MUSIC_ARTIST_ITEM_NUM, + .grid_padding = MUSIC_ARTIST_GRID_PADDING, + .gclass = &_gclass[E_MUSIC_ARTIST], + .get_item_list = _get_artist_list, + .free_item_list = _free_item_list, + }, /* Other view mode data will be added later */ }; @@ -204,5 +312,5 @@ struct grid_data *get_music_grid_data(int type) return NULL; } - return &_gdata[E_MUSIC_SONG]; + return &_gdata[type]; } diff --git a/src/layout/music.c b/src/layout/music.c index ad68f86..8c23511 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -258,13 +258,33 @@ err: return NULL; } +static struct datamgr *_get_datamgr(struct _priv *priv) +{ + struct datamgr *dmgr; + + switch (priv->view_mode) { + case E_MUSIC_SONG: + dmgr = priv->dmgr[E_DATA_MEDIA]; + break; + case E_MUSIC_ALBUM: + case E_MUSIC_ARTIST: + dmgr = priv->dmgr[E_DATA_ALBUM]; + break; + default: + dmgr = NULL; + break; + } + + return dmgr; +} + static void _update_content_info(struct _priv *priv) { struct datamgr *dmgr; int count; char buf[128]; - dmgr = priv->dmgr[E_DATA_MEDIA]; + dmgr = _get_datamgr(priv); if (!dmgr) return; @@ -281,9 +301,14 @@ static void _update_content_info(struct _priv *priv) static void _clear_content_list(struct _priv *priv) { + struct datamgr *dmgr; + if (priv->media_list) { - priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], - priv->media_list); + dmgr = _get_datamgr(priv); + if (!dmgr) + return; + + priv->gdata->free_item_list(dmgr, priv->media_list); priv->media_list = NULL; } @@ -293,6 +318,7 @@ static void _clear_content_list(struct _priv *priv) static void _update_content_list(struct _priv *priv) { Eina_List *list; + struct datamgr *dmgr; if (priv->media_list) { _update_content_info(priv); @@ -301,14 +327,18 @@ static void _update_content_list(struct _priv *priv) priv->gdata = get_music_grid_data(priv->view_mode); - list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); + dmgr = _get_datamgr(priv); + if (!dmgr) + return; + + list = priv->gdata->get_item_list(dmgr); if (!list) { elm_object_part_text_set(priv->layout, PART_NOCONTENT, TEXT_NOCONTENT); return; } - priv->gdata->data = priv->dmgr[E_DATA_MEDIA]; + priv->gdata->data = dmgr; if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) _ERR("failed to update list area"); @@ -507,6 +537,7 @@ err: static void _destroy(void *layout_data) { struct _priv *priv; + struct datamgr *dmgr; if (!layout_data) { _ERR("failed to get layout data"); @@ -515,7 +546,9 @@ static void _destroy(void *layout_data) priv = layout_data; - priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], priv->media_list); + dmgr = _get_datamgr(priv); + + priv->gdata->free_item_list(dmgr, priv->media_list); _destroy_utils(priv); @@ -611,6 +644,10 @@ static void _update(void *layout_data, int update_type, void *data) vdata = data; mode = vdata->index; + /* Genre and folder view mode will be implemented later. */ + if (mode == E_MUSIC_GENRE || mode == E_MUSIC_FOLDER) + return; + if (mode == priv->view_mode) return;