From 676fd61c56d31ab525c90957b0246f77931e3598 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 11 Sep 2015 13:08:04 +0900 Subject: movie: add genre view mode Change-Id: I77fb921a32c6367917e5f8ae3cb93531c01069b0 Signed-off-by: Jehun Lim --- src/data/mediadata.c | 109 ++++++++++++++++++++++++++++++++++++++++----- src/grid/grid_movie.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++---- src/layout/gallery.c | 1 + src/layout/movie.c | 1 + src/layout/music.c | 1 + 5 files changed, 214 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/data/mediadata.c b/src/data/mediadata.c index bfea7c7..d57cbed 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -27,6 +27,7 @@ typedef char *(*group_name_get)(app_media_info *info); static int _compare_cb_date(const void *, const void *); static int _compare_cb_name(const void *, const void *); +static int _compare_cb_genre(const void *, const void *); static int _compare_title(struct group_info *, app_media_info *); static char *_get_title(app_media_info *); @@ -34,6 +35,9 @@ static void *_get_data_title(app_media_info *info); static int _compare_time(struct group_info *, app_media_info *); static char *_get_time(app_media_info *); static void *_get_data_time(app_media_info *info); +static int _compare_genre(struct group_info *, app_media_info *); +static char *_get_genre(app_media_info *); +static void *_get_data_genre(app_media_info *); enum _filter_type { E_FILTER_FOLDER = 0, @@ -56,10 +60,11 @@ struct _data { struct _sort_info { int order_type; const char *order_keyword; - Eina_Compare_Cb func; }; struct _list_info { + Eina_Compare_Cb sort_cmp_cb; + media_compare media_cmp; media_compare_data_get data_get; group_name_get name_get; @@ -69,26 +74,32 @@ static struct _sort_info g_sort_info[E_SORT_MAX] = { [E_SORT_DATE] = { .order_type = MEDIA_CONTENT_ORDER_DESC, .order_keyword = MEDIA_MODIFIED_TIME, - .func = _compare_cb_date, }, [E_SORT_NAME] = { .order_type = MEDIA_CONTENT_ORDER_ASC, .order_keyword = MEDIA_TITLE, - .func = _compare_cb_name, } }; static struct _list_info g_list_info[E_LIST_MAX] = { + [E_LIST_DATE] = { + .sort_cmp_cb = _compare_cb_date, + .media_cmp = _compare_time, + .name_get = _get_time, + .data_get = _get_data_time, + }, [E_LIST_NAME] = { + .sort_cmp_cb = _compare_cb_name, .media_cmp = _compare_title, .name_get = _get_title, .data_get = _get_data_title, }, - [E_LIST_DATE] = { - .media_cmp = _compare_time, - .name_get = _get_time, - .data_get = _get_data_time, - } + [E_LIST_GENRE] = { + .sort_cmp_cb = _compare_cb_genre, + .media_cmp = _compare_genre, + .name_get = _get_genre, + .data_get = _get_data_genre, + }, }; static bool _create_filter(struct _data *data, filter_h *filter, int type) @@ -193,6 +204,56 @@ static char *_get_time(app_media_info *info) return _get_date_string(info->content_time); } +static const char *_get_genre_string(app_media_info *info) +{ + const char *genre; + + if (info->media_type == MEDIA_CONTENT_TYPE_VIDEO) + genre = info->video->genre; + else if (info->media_type == MEDIA_CONTENT_TYPE_MUSIC) + genre = info->audio->genre; + else + genre = NULL; + + return genre; +} + +static int _compare_genre(struct group_info *gi, app_media_info *info) +{ + const char *genre; + + genre = _get_genre_string(info); + + if (!gi || !gi->data || !genre) + return -1; + + return strcmp(gi->data, genre); +} + +static void *_get_data_genre(app_media_info *info) +{ + const char *genre; + + genre = _get_genre_string(info); + + if (!genre) + return NULL; + + return strdup(genre); +} + +static char *_get_genre(app_media_info *info) +{ + const char *genre; + + genre = _get_genre_string(info); + + if (!genre) + return NULL; + + return strdup(genre); +} + static int _compare_cb_date(const void *data1, const void *data2) { app_media *am1, *am2; @@ -234,11 +295,35 @@ static int _compare_cb_name(const void *data1, const void *data2) return strcasecmp(info1->display_name, info2->display_name); } +static int _compare_cb_genre(const void *data1, const void *data2) +{ + app_media *am1, *am2; + app_media_info *info1, *info2; + const char *genre1, *genre2; + + am1 = (app_media *)data1; + am2 = (app_media *)data2; + + info1 = app_media_get_info(am1); + info2 = app_media_get_info(am2); + + if (!info1 || !info2) + return -1; + + genre1 = _get_genre_string(info1); + genre2 = _get_genre_string(info2); + + if (!genre1 || !genre2) + return -1; + + return strcmp(genre1, genre2); +} + static Eina_List *_sort_list(Eina_List *list, int sort) { Eina_List *sorted_list; - sorted_list = eina_list_sort(list, 0, g_sort_info[sort].func); + sorted_list = eina_list_sort(list, 0, g_list_info[sort].sort_cmp_cb); return sorted_list; } @@ -327,7 +412,9 @@ struct mediadata *mediadata_create(const char *media_type, media_content_disconnect(); - md->media_list = _sort_list(data.media_list, data.sort_type); + md->media_list = eina_list_clone(data.media_list); + + eina_list_free(data.media_list); return md; } @@ -369,6 +456,8 @@ Eina_List *mediadata_get_list(struct mediadata *md, int list_type) return NULL; } + md->media_list = _sort_list(md->media_list, list_type); + gi = NULL; list = NULL; EINA_LIST_FOREACH(md->media_list, l, am) { diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 0ec306d..359f834 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -29,7 +29,9 @@ #include "grid/grid.h" #include "util/util.h" -static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) +#define STR_GENRE_NAME "Genre" + +static char *_media_text_get(void *data, Evas_Object *obj, const char *part) { app_media *am; app_media_info *info; @@ -48,7 +50,7 @@ static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) return strdup(info->title); } -static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, +static Evas_Object *_media_content_get(void *data, Evas_Object *obj, const char *part) { Evas_Object *eo; @@ -100,7 +102,58 @@ static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, return eo; } -static Eina_List *_get_item_list(struct mediadata *md) +static char *_group_text_get(void *data, Evas_Object *obj, const char *part) +{ + struct group_info *gi; + char buf[32]; + int cnt; + + if (!data) + return NULL; + + gi = data; + + if (!strcmp(part, PART_ELM_TEXT_TITLE)) + return strdup(gi->name); + else if (!strcmp(part, PART_ELM_TEXT_COUNT)) { + cnt = eina_list_count(gi->list); + snprintf(buf, sizeof(buf), "%d", cnt); + return strdup(buf); + } + + return NULL; +} + +static Evas_Object *_group_content_get(void *data, Evas_Object *obj, + const char *part) +{ + Evas_Object *eo; + struct group_info *gi; + struct color_data bg; + + if (!data) + return NULL; + + gi = data; + + eo = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_BG)) { + eo = evas_object_rectangle_add(obj); + if (!eo) { + _ERR("failed to create rectangle object"); + return NULL; + } + + app_contents_get_color(gi->name, &bg, NULL); + evas_object_color_set(eo, bg.r, bg.g, bg.b, bg.a); + + evas_object_show(eo); + } + + return eo; +} + +static Eina_List *_get_name_list(struct mediadata *md) { if (!md) { _ERR("invalid argument"); @@ -110,11 +163,47 @@ static Eina_List *_get_item_list(struct mediadata *md) return mediadata_get_list(md, E_LIST_NAME); } -static void _free_item_list(Eina_List *list) +static Eina_List *_get_genre_list(struct mediadata *md) +{ + Eina_List *list; + struct group_info *gi; + + if (!md) { + _ERR("invalid argument"); + return NULL; + } + + gi = calloc(1, sizeof(*gi)); + if (!gi) { + _ERR("failed to allocate memory"); + return NULL; + } + + gi->name = STR_GENRE_NAME; + gi->list = mediadata_get_list(md, E_LIST_GENRE); + + list = NULL; + list = eina_list_append(list, gi); + + return list; +} + +static void _free_name_list(Eina_List *list) { mediadata_free_list(list); } +static void _free_genre_list(Eina_List *list) +{ + Eina_List *l; + struct group_info *gi; + + EINA_LIST_FOREACH(list, l, gi) { + mediadata_free_list(gi->list); + free(gi); + } +} + static void _key_down_cb(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev) { @@ -174,8 +263,13 @@ static void _selected_cb(void *data, Elm_Object_Item *it) static struct grid_class _gclass[] = { [E_MOVIE_NAME] = { .item_style = STYLE_MOVIE_NAME, - .text_get = _grid_text_get, - .content_get = _grid_content_get + .text_get = _media_text_get, + .content_get = _media_content_get + }, + [E_MOVIE_GENRE] = { + .item_style = STYLE_MOVIE_GENRE, + .text_get = _group_text_get, + .content_get = _group_content_get }, /* Other view mode class will be added later */ }; @@ -187,11 +281,20 @@ static struct grid_data _gdata[] = { .item_num = MOVIE_NAME_ITEM_NUM, .grid_padding = MOVIE_NAME_GRID_PADDING, .gclass = &_gclass[E_MOVIE_NAME], - .get_item_list = _get_item_list, - .free_item_list = _free_item_list, + .get_item_list = _get_name_list, + .free_item_list = _free_name_list, .key_down_cb = _key_down_cb, .selected_cb = _selected_cb }, + [E_MOVIE_GENRE] = { + .item_x = MOVIE_GENRE_ITEM_X, + .item_y = MOVIE_GENRE_ITEM_Y, + .item_num = MOVIE_GENRE_ITEM_NUM, + .grid_padding = MOVIE_GENRE_GRID_PADDING, + .gclass = &_gclass[E_MOVIE_GENRE], + .get_item_list = _get_genre_list, + .free_item_list = _free_genre_list + }, /* Other view mode data will be added later */ }; @@ -203,5 +306,5 @@ struct grid_data *get_movie_grid_data(int type) } /* It will be fixed later */ - return &_gdata[E_MOVIE_NAME]; + return &_gdata[type]; } diff --git a/src/layout/gallery.c b/src/layout/gallery.c index c279df5..0a738d5 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -207,6 +207,7 @@ static bool _create(layoutmgr *lmgr, void *data) priv->view_btn = ld->bottom; priv->lmgr = lmgr; priv->md = md; + priv->gdata = get_gallery_grid_data(E_GALLERY_EVENT); ldata = _create_listmgr_data(priv); if (!ldata) { diff --git a/src/layout/movie.c b/src/layout/movie.c index e81fc7b..97d5389 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -469,6 +469,7 @@ static bool _create(layoutmgr *lmgr, void *data) priv->view_btn = ld->bottom; priv->lmgr = lmgr; priv->md = md; + priv->gdata = get_movie_grid_data(E_MOVIE_NAME); ldata = _create_listmgr_data(priv); if (!ldata) { diff --git a/src/layout/music.c b/src/layout/music.c index 0ee6d95..273cf13 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -410,6 +410,7 @@ static bool _create(layoutmgr *lmgr, void *data) priv->view_btn = ld->bottom; priv->lmgr = lmgr; priv->md = md; + priv->gdata = get_music_grid_data(E_MUSIC_SONG); ldata = _create_listmgr_data(priv); if (!ldata) { -- cgit v1.2.3