music: draw content list area 13/44213/1
authorJehun Lim <jehun.lim@samsung.com>
Mon, 20 Jul 2015 01:55:37 +0000 (10:55 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Mon, 20 Jul 2015 01:55:37 +0000 (10:55 +0900)
Change-Id: I9e86ff43849a19c2310b4a6254f6da5a69a421cb
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
include/layout/music.h
res/edc/layout/music.edc
src/layout/music.c

index 89ac040..ea3efde 100644 (file)
@@ -21,4 +21,6 @@
 
 #define GRP_MUSIC_LAYOUT "group.music_layout"
 
+#define STYLE_GRID_SONG_ITEM "song_item"
+
 #endif /* __AIR_MEDIAHUB_LAYOUT_MUSIC_H__ */
index e2b0788..18a60da 100644 (file)
@@ -16,4 +16,5 @@
 
 group {
        name: GRP_MUSIC_LAYOUT;
+       inherit: GRP_MOVIE_LAYOUT;
 }
index 4a95782..e673555 100644 (file)
  */
 
 #include <Elementary.h>
+#include <media_content.h>
 #include <app_debug.h>
+#include <app_media.h>
+#include <gridmgr.h>
 #include <layoutmgr.h>
+#include <viewmgr.h>
 
 #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 = {