music: add album and artist view mode 97/48297/1
authorJehun Lim <jehun.lim@samsung.com>
Thu, 17 Sep 2015 10:50:39 +0000 (19:50 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Thu, 17 Sep 2015 11:00:55 +0000 (20:00 +0900)
Change-Id: Iacf502689f966ea9f64de1c13dac9b5dabbd6d72
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
include/grid/grid.h
res/edc/widgets/gengrid.edc
src/grid/grid_music.c
src/layout/music.c

index a03a873..e1fb94e 100644 (file)
@@ -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__ */
index fb6f153..2b9e6fd 100644 (file)
  */
 
 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;
index 7ef538f..dcdc70e 100644 (file)
@@ -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];
 }
index ad68f86..8c23511 100644 (file)
@@ -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;