From 6d092688475ec14bf4357ae32734098a6d5bae82 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 8 Jul 2015 16:46:52 +0900 Subject: [PATCH 01/16] gallery: add copyright condition for media list Change-Id: I4fe32eb972df44f331d255b166b21a820b1d6e84 Signed-off-by: Jehun Lim --- src/layout/gallery.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 2c6f7fe..939a86b 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -28,7 +28,8 @@ #include "util/listmgr.h" #include "util/util.h" -#define LIST_MEDIA_COND "media_type=0 OR media_type=1" +#define LIST_MEDIA_COND "(media_type=0 OR media_type=1) \ + AND copyright LIKE \"Unknown\"" #define TEXT_NOCONTENT "No Photo & Video" -- 2.7.4 From 3373ddc4e10198d6f322b258156e0c263427b5a4 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 8 Jul 2015 17:13:13 +0900 Subject: [PATCH 02/16] viewer: add update function for getting media list from base view Change-Id: I9f7aa2b87a36071e0eae410439070a3ea8dec3af Signed-off-by: Minkyu Kang --- include/view.h | 2 +- src/layout/gallery.c | 14 +++----- src/layout/movie.c | 14 +++----- src/view/viewer.c | 90 +++++++++++++++------------------------------------- 4 files changed, 34 insertions(+), 86 deletions(-) diff --git a/include/view.h b/include/view.h index afa40e8..18a07bf 100644 --- a/include/view.h +++ b/include/view.h @@ -24,7 +24,7 @@ view_class *view_base_get_vclass(void); view_class *view_viewer_get_vclass(void); /* view data */ -struct view_data { +struct view_update_data { Eina_List *list; int index; }; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 939a86b..ecac88b 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -101,7 +101,7 @@ static struct grid_class _gclass = { static void _grid_selected_cb(void *data, Elm_Object_Item *it) { app_media *am; - struct view_data *vdata; + struct view_update_data vdata; struct _priv *priv; if (!data || !it) { @@ -117,16 +117,10 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it) return; } - vdata = calloc(1, sizeof(*vdata)); - if (!vdata) { - _ERR("failed to allocate view data"); - return; - } - - vdata->list = mediadata_get_medialist(priv->md); - vdata->index = util_get_media_index(vdata->list, am); + vdata.list = mediadata_get_medialist(priv->md); + vdata.index = util_get_media_index(vdata.list, am); - viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, vdata); + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); } diff --git a/src/layout/movie.c b/src/layout/movie.c index f0d1478..d127e31 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -117,7 +117,7 @@ static struct grid_class _gclass = { static void _grid_selected_cb(void *data, Elm_Object_Item *it) { app_media *am; - struct view_data *vdata; + struct view_update_data vdata; struct _priv *priv; if (!data || !it) { @@ -133,16 +133,10 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it) return; } - vdata = calloc(1, sizeof(*vdata)); - if (!vdata) { - _ERR("failed to allocate view data"); - return; - } - - vdata->list = mediadata_get_medialist(priv->md); - vdata->index = util_get_media_index(vdata->list, am); + vdata.list = mediadata_get_medialist(priv->md); + vdata.index = util_get_media_index(vdata.list, am); - viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, vdata); + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); } diff --git a/src/view/viewer.c b/src/view/viewer.c index 79f2e51..4a80d83 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -24,6 +24,7 @@ #include #include "define.h" +#include "view.h" #include "util/controller.h" #include "util/timeout_handler.h" #include "util/playermgr.h" @@ -173,62 +174,6 @@ static struct _viewer_info viewer_info[] = { }, }; -/* FIXME: test function */ -static bool _media(media_info_h media_h, void *dt) -{ - struct _priv *priv; - app_media *am; - - priv = dt; - - am = app_media_create(media_h); - - priv->playlist.list = eina_list_append(priv->playlist.list, am); - - return true; -} - -static void _media_test(struct _priv *priv, int mode) -{ - char *path = "/home/owner/content/Videos/Xmen-Days_of_Future_Past.mp4"; - filter_h filter; - char buf[1024]; - int r; - - r = media_filter_create(&filter); - if (r != MEDIA_CONTENT_ERROR_NONE) { - _ERR("Media Filter Creation Failed"); - return; - } - - if (mode) - snprintf(buf, sizeof(buf), "MEDIA_PATH = \"%s\"", path); - else - snprintf(buf, sizeof(buf), "MEDIA_TYPE=0 OR MEDIA_TYPE=1"); - - r = media_filter_set_condition(filter, buf, - MEDIA_CONTENT_COLLATE_DEFAULT); - if (r != MEDIA_CONTENT_ERROR_NONE) { - _ERR("Fail to set filter condition"); - media_filter_destroy(filter); - return; - } - - media_content_connect(); - - r = media_info_foreach_media_from_db(filter, _media, priv); - if (r != MEDIA_CONTENT_ERROR_NONE) { - _ERR("MEDIA CONTENT ERROR: %d", r); - media_filter_destroy(filter); - media_content_disconnect(); - return; - } - - media_filter_destroy(filter); - media_content_disconnect(); -} -/* FIXME: test function end */ - /* * NOTE: Workaround * we assumed that if video content have the copyright then it's a movie. @@ -385,7 +330,7 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) elm_object_part_text_set(priv->base, PART_VIEWER_TITLE, mi->title); } else { - strftime(date, sizeof(date), "%d %b", mi->content_time); + strftime(date, sizeof(date), "%d %b, %Y", mi->content_time); strftime(day, sizeof(day), "%a", mi->content_time); util_up_string(day); @@ -883,9 +828,6 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } - /* FIXME: test code */ - _media_test(priv, 0); - viewmgr_set_view_data(VIEW_VIEWER, priv); return base; @@ -902,7 +844,6 @@ static void _show(void *view_data) priv = view_data; - /* FIXME: test code */ _viewer_show(priv, DIR_NONE); timeout_handler_reset(priv->timeout); @@ -926,10 +867,31 @@ static void _hide(void *view_data) evas_object_hide(priv->base); } +static void _update(void *view_data, int update_type, void *data) +{ + struct _priv *priv; + struct view_update_data *vdata; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + if (!data) { + _ERR("invalid parameter"); + return; + } + + priv = view_data; + vdata = data; + + priv->playlist.list = vdata->list; + priv->playlist.cur = vdata->index; +} + static void _destroy(void *view_data) { struct _priv *priv; - app_media *am; if (!view_data) { _ERR("failed to get view data"); @@ -940,9 +902,6 @@ static void _destroy(void *view_data) _viewer_delete(priv); - EINA_LIST_FREE(priv->playlist.list, am) - app_media_destroy(am); - timeout_handler_fini(priv->timeout); playermgr_destroy(priv->player); @@ -957,6 +916,7 @@ static view_class _vclass = { .create = _create, .show = _show, .hide = _hide, + .update = _update, .destroy = _destroy, }; -- 2.7.4 From bdf90efceec6ba4f371897c4f5a044560841a995 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 9 Jul 2015 09:24:22 +0900 Subject: [PATCH 03/16] viewer: process back key event Change-Id: I633b86d66247b334d57170dfbf51c31f652310b0 Signed-off-by: Minkyu Kang --- src/util/timeout_handler.c | 1 - src/view/viewer.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/util/timeout_handler.c b/src/util/timeout_handler.c index e35f571..4d73de1 100644 --- a/src/util/timeout_handler.c +++ b/src/util/timeout_handler.c @@ -87,7 +87,6 @@ struct timeout_handler *timeout_handler_init(double timeout, int i; int event_type[] = { ECORE_EVENT_KEY_UP, - ECORE_EVENT_KEY_DOWN, ECORE_EVENT_MOUSE_BUTTON_DOWN, ECORE_EVENT_MOUSE_BUTTON_UP, ECORE_EVENT_MOUSE_MOVE, diff --git a/src/view/viewer.c b/src/view/viewer.c index 4a80d83..8adbea9 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -329,6 +330,9 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) if (id == VIEWER_MOVIE) { elm_object_part_text_set(priv->base, PART_VIEWER_TITLE, mi->title); + + elm_object_part_text_set(priv->base, PART_VIEWER_DATE, ""); + elm_object_part_text_set(priv->base, PART_VIEWER_PAGE, ""); } else { strftime(date, sizeof(date), "%d %b, %Y", mi->content_time); strftime(day, sizeof(day), "%a", mi->content_time); @@ -341,6 +345,8 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) snprintf(buf, sizeof(buf), "%d / %d", priv->playlist.cur + 1, eina_list_count(priv->playlist.list)); elm_object_part_text_set(priv->base, PART_VIEWER_PAGE, buf); + + elm_object_part_text_set(priv->base, PART_VIEWER_TITLE, ""); } } @@ -562,6 +568,16 @@ static void _hide_bar(struct _priv *priv) ctl->ops->disable(ctl->handle); } +static void _pop_view(struct _priv *priv) +{ + struct view_update_data vdata; + + vdata.index = priv->playlist.cur; + + viewmgr_update_view(VIEW_BASE, UPDATE_FOCUS, &vdata); + viewmgr_pop_view(); +} + static void _timeout_cb(void *data, int type, void *ei) { _hide_bar(data); @@ -569,6 +585,30 @@ static void _timeout_cb(void *data, int type, void *ei) static void _event_cb(void *data, int type, void *ei) { + struct _priv *priv; + + if (!data) + return; + + priv = data; + + if (type == ECORE_EVENT_KEY_UP) { + Evas_Event_Key_Up *ev; + + if (!ei) + return; + + ev = ei; + + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + if (priv->bar_show) { + _pop_view(priv); + return; + } + } + } + _show_bar(data); } -- 2.7.4 From 678f78f436ecfa98835e90f236504744ee9f4d51 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 9 Jul 2015 15:43:33 +0900 Subject: [PATCH 04/16] listmgr: set current state of selected item to false Change-Id: I5713ccb9057770c14451e26436ea9e27acee7cad Signed-off-by: Jehun Lim --- src/util/listmgr.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/util/listmgr.c b/src/util/listmgr.c index a340e1f..b671a49 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -66,6 +66,8 @@ void _grid_selected_cb(void *data, Elm_Object_Item *it, if (ldata->grid_selected_cb) ldata->grid_selected_cb(ldata->cb_data, it); + + elm_gengrid_item_selected_set(it, EINA_FALSE); } void _grid_realized_cb(int id, void *data, Evas_Object *obj, -- 2.7.4 From 4c8cb9d73a17594fcb8da1912f728202c5e969a4 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 9 Jul 2015 17:38:58 +0900 Subject: [PATCH 05/16] timeout_handler: add function for enable/disable handler Change-Id: I45dc8113dd9e5b8d8f336476c1753966849910a0 Signed-off-by: Minkyu Kang --- include/util/timeout_handler.h | 2 ++ src/util/timeout_handler.c | 18 ++++++++++++++++++ src/view/viewer.c | 3 +++ 3 files changed, 23 insertions(+) diff --git a/include/util/timeout_handler.h b/include/util/timeout_handler.h index 29dd6e1..5cd0aab 100644 --- a/include/util/timeout_handler.h +++ b/include/util/timeout_handler.h @@ -29,4 +29,6 @@ void timeout_handler_fini(struct timeout_handler *handle); void timeout_handler_reset(struct timeout_handler *handle); +void timeout_handler_enable(struct timeout_handler *handle, bool enable); + #endif diff --git a/src/util/timeout_handler.c b/src/util/timeout_handler.c index 4d73de1..dce195f 100644 --- a/src/util/timeout_handler.c +++ b/src/util/timeout_handler.c @@ -31,6 +31,7 @@ struct timeout_handler { void *timeout_data; double timeout; + bool enable; }; static Eina_Bool _timer_cb(void *data) @@ -42,6 +43,9 @@ static Eina_Bool _timer_cb(void *data) handle = data; + if (!handle->enable) + return ECORE_CALLBACK_CANCEL; + handle->timeout_cb(handle->timeout_data, 0, NULL); handle->timer = NULL; @@ -57,6 +61,9 @@ static Eina_Bool _event_occured(void *data, int type, void *event) handle = data; + if (!handle->enable) + return ECORE_CALLBACK_PASS_ON; + handle->event_cb(handle->event_data, type, event); timeout_handler_reset(handle); @@ -64,6 +71,16 @@ static Eina_Bool _event_occured(void *data, int type, void *event) return ECORE_CALLBACK_PASS_ON; } +void timeout_handler_enable(struct timeout_handler *handle, bool enable) +{ + handle->enable = enable; + + if (!enable) { + ecore_timer_del(handle->timer); + handle->timer = NULL; + } +} + void timeout_handler_reset(struct timeout_handler *handle) { if (!handle) { @@ -117,6 +134,7 @@ struct timeout_handler *timeout_handler_init(double timeout, handle->timeout_cb = timeout_cb; handle->timeout_data = timeout_data; handle->timeout = timeout; + handle->enable = false; return handle; diff --git a/src/view/viewer.c b/src/view/viewer.c index 8adbea9..e3a9a8a 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -886,6 +886,7 @@ static void _show(void *view_data) _viewer_show(priv, DIR_NONE); + timeout_handler_enable(priv->timeout, true); timeout_handler_reset(priv->timeout); evas_object_show(priv->base); @@ -904,6 +905,8 @@ static void _hide(void *view_data) _viewer_hide(priv); + timeout_handler_enable(priv->timeout, false); + evas_object_hide(priv->base); } -- 2.7.4 From 36c8f5cca81bff26bcbcbe928d384101bfcb351f Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 10 Jul 2015 11:14:25 +0900 Subject: [PATCH 06/16] listmgr: remove the code to free listmgr data Change-Id: I6b6a7e362e689f289f5d9a2ba75853c62daa5ad4 Signed-off-by: Jehun Lim --- src/layout/gallery.c | 4 ++++ src/layout/movie.c | 4 ++++ src/util/listmgr.c | 1 - 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/layout/gallery.c b/src/layout/gallery.c index ecac88b..00df395 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -46,6 +46,7 @@ struct _priv { layoutmgr *lmgr; struct listmgr *listmgr; + struct listmgr_data *ldata; struct mediadata *md; @@ -226,6 +227,7 @@ static bool _create(layoutmgr *lmgr, void *data) priv->layout = layout; priv->lmgr = lmgr; priv->listmgr = listmgr; + priv->ldata = ldata; priv->md = md; layoutmgr_set_layout_data(lmgr, LAYOUT_GALLERY, priv); @@ -263,8 +265,10 @@ static void _destroy(void *layout_data) mediadata_destroy(priv->md); listmgr_destroy(priv->listmgr); + free(priv->ldata); evas_object_del(priv->layout); + free(priv); } diff --git a/src/layout/movie.c b/src/layout/movie.c index d127e31..a3fa193 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -46,6 +46,7 @@ struct _priv { layoutmgr *lmgr; struct listmgr *listmgr; + struct listmgr_data *ldata; struct mediadata *md; @@ -242,6 +243,7 @@ static bool _create(layoutmgr *lmgr, void *data) priv->layout = layout; priv->lmgr = lmgr; priv->listmgr = listmgr; + priv->ldata = ldata; priv->md = md; layoutmgr_set_layout_data(lmgr, LAYOUT_MOVIE, priv); @@ -279,8 +281,10 @@ static void _destroy(void *layout_data) mediadata_destroy(priv->md); listmgr_destroy(priv->listmgr); + free(priv->ldata); evas_object_del(priv->layout); + free(priv); } diff --git a/src/util/listmgr.c b/src/util/listmgr.c index b671a49..c45b6ec 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -262,7 +262,6 @@ void listmgr_destroy(struct listmgr *lmgr) } gridmgr_destroy(lmgr->gmgr); - free(lmgr->data); free(lmgr); } -- 2.7.4 From 00afafce7a236b7b533e715a675db6619e8be019 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 10 Jul 2015 13:32:17 +0900 Subject: [PATCH 07/16] progressbar: add slider style argument in create function Change-Id: I200c6ac8734672e6e27bb52ae7ddfd112c12ce95 Signed-off-by: Jehun Lim --- include/util/progressbar.h | 2 +- src/util/progressbar.c | 6 ++++-- src/view/viewer.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/util/progressbar.h b/include/util/progressbar.h index c93a87e..792dcc8 100644 --- a/include/util/progressbar.h +++ b/include/util/progressbar.h @@ -24,7 +24,7 @@ struct progressbar_ops { int (*set_value)(void *data); }; -struct progressbar *progressbar_create(Evas_Object *base); +struct progressbar *progressbar_create(Evas_Object *base, const char *style); void progressbar_destroy(struct progressbar *m); void progressbar_set_parts(struct progressbar *m, const char *slider, diff --git a/src/util/progressbar.c b/src/util/progressbar.c index 853b507..756c44a 100644 --- a/src/util/progressbar.c +++ b/src/util/progressbar.c @@ -207,7 +207,7 @@ void progressbar_set_parts(struct progressbar *m, const char *slider, m->str_separator = strdup(separator); } -struct progressbar *progressbar_create(Evas_Object *base) +struct progressbar *progressbar_create(Evas_Object *base, const char *style) { struct progressbar *m; Evas_Object *obj; @@ -227,10 +227,12 @@ struct progressbar *progressbar_create(Evas_Object *base) elm_slider_indicator_show_set(obj, EINA_FALSE); elm_slider_indicator_show_on_focus_set(obj, EINA_FALSE); - elm_object_style_set(obj, STYLE_VIEWER_PROGRESS); elm_slider_horizontal_set(obj, EINA_TRUE); elm_slider_step_set(obj, SLIDER_DEFAULT); + if (style) + elm_object_style_set(obj, style); + /* FIXME: focus disabled */ elm_object_focus_allow_set(obj, EINA_FALSE); diff --git a/src/view/viewer.c b/src/view/viewer.c index e3a9a8a..0e8db1c 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -775,7 +775,7 @@ static bool _ui_init(struct _priv *priv) goto err; } - prog = progressbar_create(priv->base); + prog = progressbar_create(priv->base, STYLE_VIEWER_PROGRESS); if (!prog) { _ERR("failed to adding progressbar"); goto err; -- 2.7.4 From 30825e5a11c75dc6c1315392a3d6d54bde2aa049 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 10 Jul 2015 14:45:45 +0900 Subject: [PATCH 08/16] add button and slider edc for recently watched content Change-Id: I15ba76bfa2ae093b6d8d0346a8ae16676e9ae8e9 Signed-off-by: Jehun Lim --- include/define.h | 4 +- include/layout/movie.h | 12 + include/view/base.h | 2 + include/view/viewer.h | 1 - res/edc/images/ic_preview_play.png | Bin 0 -> 11370 bytes res/edc/widgets/button.edc | 564 +++++++++++++++++++++++++++++++++++++ res/edc/widgets/slider.edc | 47 ++++ 7 files changed, 628 insertions(+), 2 deletions(-) create mode 100644 res/edc/images/ic_preview_play.png diff --git a/include/define.h b/include/define.h index 905eaea..dd55262 100644 --- a/include/define.h +++ b/include/define.h @@ -53,7 +53,9 @@ #define PART_ELM_SWALLOW_VIDEO "elm.swallow.video" /* signal */ -#define SIG_ITEM_SELECTED "item_selected" +#define SIG_BTN_CLICKED "btn,clicked" +#define SIG_ITEM_SELECTED "item,selected" #define SIG_SOURCE_EDC "edc" +#define SIG_SOURCE_SRC "src" #endif /* __AIR_MEDIAHUB_DEFINE_H__ */ diff --git a/include/layout/movie.h b/include/layout/movie.h index 5d10efc..640ea4e 100644 --- a/include/layout/movie.h +++ b/include/layout/movie.h @@ -17,13 +17,25 @@ #ifndef __AIR_MEDIAHUB_LAYOUT_MOVIE_H__ #define __AIR_MEDIAHUB_LAYOUT_MOVIE_H__ +/* layout */ #define LAYOUT_MOVIE "LAYOUT_MOVIE" +/* group */ #define GRP_MOVIE_LAYOUT "group.movie_layout" +#define GRP_MOVIE_RECENT_CONTENT "group.movie_recent_content" +/* part */ #define PART_CONTENT "part.content" #define PART_NOCONTENT "part.nocontent" +#define PART_RECENT_CONTENT_THUMBNAIL "part.recent_content_thumbnail" +#define PART_RECENT_CONTENT_TITLE "part.recent_content_title" +#define PART_RECENT_CONTENT_DATE "part.recent_content_date" +#define PART_RECENT_CONTENT_PROGRESS "part.recent_content_progress" +#define PART_RECENT_CONTENT_TOTAL "part.recent_content_total" +#define PART_RECENT_CONTENT_SLIDER "part.recent_content_slider" +/* style */ #define STYLE_GRID_MOVIE_ITEM "movie_item" +#define STYLE_BTN_RECENT_CONTENT "base_btn_recent" #endif /* __AIR_MEDIAHUB_LAYOUT_MOVIE_H__ */ diff --git a/include/view/base.h b/include/view/base.h index a40dd4e..aa909e6 100644 --- a/include/view/base.h +++ b/include/view/base.h @@ -34,10 +34,12 @@ #define PART_ITEM_CONTENT "part.item_content" /* images */ +#define IMAGE_PREVIEW_PLAY "ic_preview_play.png" #define IMAGE_THUMBNAIL_PLAY IMAGEDIR"/ic_thumbnail_play.png" /* style */ #define STYLE_BTN_MENU "base_btn_menu" #define STYLE_BTN_INDEX "base_btn_index" +#define STYLE_BASE_PROGRESS "base_recent_progress" #endif /* __AIR_MEDIAHUB_VIEW_BASE_H__ */ diff --git a/include/view/viewer.h b/include/view/viewer.h index 580e287..d3d494e 100644 --- a/include/view/viewer.h +++ b/include/view/viewer.h @@ -40,7 +40,6 @@ /* signal */ #define SIG_SET_PLAY "set,play,icon" #define SIG_SET_PAUSE "set,pause,icon" -#define SIG_BTN_CLICKED "btn,clicked" #define SIG_BTN_CALLBACK "btn,callback" #define SIG_HIDE_BAR "hide,bar" #define SIG_SHOW_BAR "show,bar" diff --git a/res/edc/images/ic_preview_play.png b/res/edc/images/ic_preview_play.png new file mode 100644 index 0000000000000000000000000000000000000000..2c20b3e7bfb5fea52e5ea82306295aad208a7cff GIT binary patch literal 11370 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

cOIfAJr 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 literal 0 HcmV?d00001 diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 27bbf34..ae8ef37 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -591,3 +591,567 @@ group { } } } + +group { + name: "elm/button/base/base_btn_recent"; + data.item, "focus_highlight" "on"; + images { + image: IMAGE_PREVIEW_PLAY COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 740 614; + } + } + part { + name: "map"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + perspective { + zplane: 0; + focal: 1000; + } + visible: 0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + perspective.zplane: -100; + } + } + part { + name: PART_RECENT_CONTENT_THUMBNAIL; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg_text"; + relative: 1.0 0.0; + } + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: "default_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_RECENT_CONTENT_THUMBNAIL; + relative: 0.5 0.5; + } + rel2 { + to: PART_RECENT_CONTENT_THUMBNAIL; + relative: 0.5 0.5; + } + image.normal: IMAGE_PREVIEW_PLAY; + min: 120 120; + fixed: 1 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: "part_focus1"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 1.0 0.0; + } + min: 0 6; + align: 0.5 0.0; + color: COLOR_ITEM_FOCUS; + fixed: 0 1; + visible: 0; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + visible: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + visible: 1; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "part_focus2"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "part_focus1"; + relative: 0.0 1.0; + } + rel2 { + to: "bg_text"; + relative: 0.0 0.0; + } + min: 6 0; + align: 0.0 0.5; + color: COLOR_ITEM_FOCUS; + fixed: 1 0; + visible: 0; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + visible: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + visible: 1; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "part_focus3"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "part_focus1"; + relative: 1.0 1.0; + } + rel2 { + to: "bg_text"; + relative: 1.0 0.0; + } + min: 6 0; + align: 1.0 0.5; + color: COLOR_ITEM_FOCUS; + fixed: 1 0; + visible: 0; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + visible: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + visible: 1; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "defaultbg_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 1.0; + } + rel2.to: "bg"; + min: 0 198; + align: 0.5 1.0; + color: COLOR_ITEM_BG; + fixed: 0 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: COLOR_ITEM_FOCUS; + map.on: 1; + } + } + part { + name: "bg_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "defaultbg_text"; + rel2.to: "defaultbg_text"; + color: COLOR_ITEM_BG; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: COLOR_ITEM_FOCUS; + map.on: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "padding_text_left"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg_text"; + rel2 { + to: "bg_text"; + relative: 0.0 0.0; + } + min: 26 28; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "padding_text_right"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg_text"; + relative: 1.0 0.0; + } + rel2 { + to: "bg_text"; + relative: 1.0 0.0; + } + min: 26 28; + align: 1.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_RECENT_CONTENT_TITLE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text_left"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_text_right"; + relative: 0.0 1.0; + } + text { + font: FONT_LIGHT; + size: 36; + align: 0.0 0.5; + } + min: 0 36; + align: 0.5 0.0; + color: COLOR_TEXT_FOCUS; + fixed: 0 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + description { + state: "selected_0" 0.0; + inherit: "selected" 0.0; + } + } + part { + name: "padding_text_date"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_RECENT_CONTENT_TITLE; + relative: 0.0 1.0; + } + rel2.to: PART_RECENT_CONTENT_TITLE; + min: 0 12; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: PART_RECENT_CONTENT_DATE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text_date"; + relative: 0.0 1.0; + } + rel2.to: "padding_text_date"; + text { + font: FONT_LIGHT; + size: 28; + align: 0.0 0.5; + } + min: 0 28; + align: 0.5 0.0; + color: COLOR_TEXT_FOCUS; + fixed: 0 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + description { + state: "selected_0" 0.0; + inherit: "selected" 0.0; + } + } + part { + name: "padding_text_time"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_RECENT_CONTENT_DATE; + relative: 0.0 1.0; + } + rel2.to: PART_RECENT_CONTENT_DATE; + min: 0 34; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: PART_RECENT_CONTENT_PROGRESS; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text_time"; + relative: 0.0 1.0; + } + rel2 { + to: "padding_text_time"; + relative: 0.0 1.0; + } + text { + font: TEXT_LIGHT; + size: 20; + align: 0.0 0.5; + } + min: 100 20; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_RECENT_CONTENT_TOTAL; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text_time"; + relative: 1.0 1.0; + } + rel2.to: "padding_text_time"; + text { + font: TEXT_LIGHT; + size: 20; + align: 1.0 0.5; + } + min: 100 20; + align: 1.0 0.0; + fixed: 1 1; + } + } + part { + name: "padding_slider"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_RECENT_CONTENT_PROGRESS; + relative: 0.0 1.0; + } + rel2.to: PART_RECENT_CONTENT_TOTAL; + min: 0 10; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: PART_RECENT_CONTENT_SLIDER; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_slider"; + relative: 0.0 1.0; + } + rel2.to: "padding_slider"; + min: 0 30; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "bg_text"; + target: PART_RECENT_CONTENT_TITLE; + target: PART_RECENT_CONTENT_DATE; + after: "focus,in,anim"; + } + program { + name: "focus,in,anim"; + action: STATE_SET "selected" 0.0; + target: PART_RECENT_CONTENT_THUMBNAIL; + target: "default_image"; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "bg_text"; + transition: LINEAR 0.17; + after: "focus,in,anim,2"; + } + program { + name: "focus,in,anim,2"; + action: STATE_SET "selected" 0.0; + target: "defaultbg_text"; + } + program { + name: "go_passive"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: PART_RECENT_CONTENT_TITLE; + target: PART_RECENT_CONTENT_DATE; + target: "defaultbg_text"; + 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: "bg_text"; + transition: LINEAR 0.17; + after: "focus,out,anim,2"; + } + program { + name: "focus,out,anim,2"; + action: STATE_SET "default" 0.0; + target: PART_RECENT_CONTENT_THUMBNAIL; + target: "default_image"; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "bg_text"; + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: SIG_BTN_CLICKED; + signal: SIG_BTN_CLICKED; + source: SIG_SOURCE_SRC; + action: STATE_SET "selected" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "after_selected"; + } + program { + name: "after_selected"; + action: STATE_SET "default" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "item_selected"; + } + program { + name: "item_selected"; + action: SIGNAL_EMIT SIG_ITEM_SELECTED SIG_SOURCE_EDC; + } + } +} diff --git a/res/edc/widgets/slider.edc b/res/edc/widgets/slider.edc index 2e0e34c..61a89a4 100644 --- a/res/edc/widgets/slider.edc +++ b/res/edc/widgets/slider.edc @@ -194,6 +194,53 @@ group { } group { + name: "elm/slider/horizontal/base_recent_progress"; + inherit: "elm/slider/horizontal/viewer_progress"; + parts { + part { + name: "base"; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 0.0; + } + min: 0 4; + fixed: 0 1; + align: 0.0 0.0; + color: 255 255 255 51; + } + } + part { + name: "glow"; + mouse_events: 0; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + rel1.to: "base"; + rel2 { + relative: 0.5 1.0; + to_x: "button"; + to_y: "base"; + } + min: 0 4; + max: 99999 4; + fixed: 0 1; + align: 0.0 1.0; + color: COLOR_TEXT_FOCUS; + } + } + } +} + +group { name: "elm/slider/horizontal/progress_indicator/default"; alias: "elm/slider/horizontal/popup/default"; parts { -- 2.7.4 From 5a9758ba402987ae667b31e312830109358658e4 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 10 Jul 2015 15:31:42 +0900 Subject: [PATCH 09/16] fix edc warnings Change-Id: Idb2484a98367cf9c61b56cc650c197da1ae377cc Signed-off-by: Jehun Lim --- res/edc/widgets/button.edc | 3 +++ res/edc/widgets/gengrid.edc | 1 + 2 files changed, 4 insertions(+) diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index ae8ef37..e35692a 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -601,10 +601,13 @@ group { parts { part { name: "bg"; + type: RECT; scale: 1; description { state: "default" 0.0; min: 740 614; + fixed: 1 1; + visible: 0; } } part { diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 51b9e77..3703001 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -699,6 +699,7 @@ group { size: 24; min: 1 0; align: 1.0 1.0; + ellipsis: -1; } min: 0 24; align: 1.0 1.0; -- 2.7.4 From 7973a7367495b2cc169d68373ae92ae64c900e7b Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 10 Jul 2015 15:30:48 +0900 Subject: [PATCH 10/16] viewer: set video position when play/stop video file Change-Id: Ideaeb01e3629fdc65e283d87e4617f0684d3550b Signed-off-by: Minkyu Kang --- include/util/playermgr.h | 2 +- src/util/playermgr.c | 8 ++++++- src/view/viewer.c | 57 +++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/include/util/playermgr.h b/include/util/playermgr.h index 7ba5831..0eafe4b 100644 --- a/include/util/playermgr.h +++ b/include/util/playermgr.h @@ -22,7 +22,7 @@ struct playermgr; struct playermgr *playermgr_create(Evas_Object *win); void playermgr_destroy(struct playermgr *m); -bool playermgr_play(struct playermgr *m, const char *path); +bool playermgr_play(struct playermgr *m, const char *path, int ms); void playermgr_stop(struct playermgr *m); bool playermgr_resume(struct playermgr *m); bool playermgr_pause(struct playermgr *m); diff --git a/src/util/playermgr.c b/src/util/playermgr.c index 07aa63c..332eebd 100644 --- a/src/util/playermgr.c +++ b/src/util/playermgr.c @@ -157,7 +157,7 @@ void playermgr_stop(struct playermgr *m) player_unprepare(m->player); } -bool playermgr_play(struct playermgr *m, const char *path) +bool playermgr_play(struct playermgr *m, const char *path, int ms) { int r; @@ -199,6 +199,12 @@ bool playermgr_play(struct playermgr *m, const char *path) return false; } + r = player_set_play_position(m->player, ms, false, NULL, NULL); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set_position error (%d)", r); + return false; + } + return true; } diff --git a/src/view/viewer.c b/src/view/viewer.c index 0e8db1c..b0ac6ca 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "define.h" #include "view.h" @@ -149,6 +150,7 @@ struct _viewer_info { }; static void _player_play(struct _priv *priv); +static void _player_stop(struct _priv *priv); static void _callback_movie(void *data, const char *ev); static void _callback_photo(void *data, const char *ev); @@ -394,6 +396,35 @@ static app_media_info *_get_current_media_info(struct _priv *priv) return mi; } +static void _set_played_position(struct _priv *priv, int position) +{ + video_meta_h video; + app_media *am; + int r; + + am = eina_list_nth(priv->playlist.list, priv->playlist.cur); + if (!am) { + _ERR("failed to get app_media"); + return; + } + + video = app_media_get_video_handle(am); + if (!video) { + _ERR("failed to getting video handle"); + return; + } + + r = video_meta_set_played_position(video, position); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to set played position"); + return; + } + + r = video_meta_update_to_db(video); + if (r != MEDIA_CONTENT_ERROR_NONE) + _ERR("failed to update db"); +} + static bool _viewer_show(struct _priv *priv, int foc) { struct _viewer_info *info; @@ -446,12 +477,14 @@ static bool _viewer_show(struct _priv *priv, int foc) } ctl->ops->focus(ctl->handle, loc, true); - _draw_contents(priv, id, mi); - _draw_title_bar(priv, id, mi); _draw_progressbar(priv, id, mi); _draw_favorite_icon(priv, id, mi); + _draw_contents(priv, id, mi); + + app_contents_recent_add(CONTENTS_MEDIA, mi->media_id); + return true; } @@ -572,6 +605,10 @@ static void _pop_view(struct _priv *priv) { struct view_update_data vdata; + if (priv->viewer.cur == VIEWER_MOVIE || + priv->viewer.cur == VIEWER_VIDEO) + _player_stop(priv); + vdata.index = priv->playlist.cur; viewmgr_update_view(VIEW_BASE, UPDATE_FOCUS, &vdata); @@ -655,7 +692,7 @@ static void _player_play(struct _priv *priv) _remove_thumbnail(priv); progressbar_start(priv->progress); - playermgr_play(priv->player, mi->file_path); + playermgr_play(priv->player, mi->file_path, mi->video->position); break; default: @@ -667,6 +704,12 @@ static void _player_play(struct _priv *priv) static void _player_stop(struct _priv *priv) { struct controller *ctl; + int position; + + if (priv->viewer.cur == VIEWER_MOVIE) { + position = playermgr_get_position(priv->player); + _set_played_position(priv, position); + } progressbar_stop(priv->progress); playermgr_stop(priv->player); @@ -685,6 +728,10 @@ static void _player_complete_cb(void *data) priv = data; progressbar_stop(priv->progress); + _set_played_position(priv, 0); + + if (priv->viewer.cur == VIEWER_MOVIE) + _pop_view(priv); } static void _player_set_position_cb(void *data) @@ -884,6 +931,8 @@ static void _show(void *view_data) priv = view_data; + media_content_connect(); + _viewer_show(priv, DIR_NONE); timeout_handler_enable(priv->timeout, true); @@ -907,6 +956,8 @@ static void _hide(void *view_data) timeout_handler_enable(priv->timeout, false); + media_content_disconnect(); + evas_object_hide(priv->base); } -- 2.7.4 From 9e4393c020e2dddc2198a726fdfb200267b90447 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 10 Jul 2015 15:50:38 +0900 Subject: [PATCH 11/16] gallery: modify the condition for media list Change-Id: Ifeee8c7b88cd902ff7de1b22670955a3e3e9a08e Signed-off-by: Jehun Lim --- src/layout/gallery.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 00df395..61607c2 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -28,8 +28,8 @@ #include "util/listmgr.h" #include "util/util.h" -#define LIST_MEDIA_COND "(media_type=0 OR media_type=1) \ - AND copyright LIKE \"Unknown\"" +#define LIST_MEDIA_COND "media_type=0 OR \ + (media_type=1 AND copyright LIKE \"Unknown\")" #define TEXT_NOCONTENT "No Photo & Video" -- 2.7.4 From e06d7568e7404fd0b395112dccc52eb6f8daed7b Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 10 Jul 2015 19:27:10 +0900 Subject: [PATCH 12/16] timeout_handler: add timer when enable the handler Change-Id: I2a815ca06cce19f94f7b0ad46abae87438f2ddf0 Signed-off-by: Minkyu Kang --- include/util/timeout_handler.h | 2 -- src/util/timeout_handler.c | 33 +++++++++++++-------------------- src/view/viewer.c | 1 - 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/include/util/timeout_handler.h b/include/util/timeout_handler.h index 5cd0aab..44ad82f 100644 --- a/include/util/timeout_handler.h +++ b/include/util/timeout_handler.h @@ -27,8 +27,6 @@ struct timeout_handler *timeout_handler_init(double timeout, void timeout_handler_fini(struct timeout_handler *handle); -void timeout_handler_reset(struct timeout_handler *handle); - void timeout_handler_enable(struct timeout_handler *handle, bool enable); #endif diff --git a/src/util/timeout_handler.c b/src/util/timeout_handler.c index dce195f..c4805f1 100644 --- a/src/util/timeout_handler.c +++ b/src/util/timeout_handler.c @@ -52,6 +52,15 @@ static Eina_Bool _timer_cb(void *data) return ECORE_CALLBACK_CANCEL; } +void _timer_reset(struct timeout_handler *handle) +{ + if (handle->timer) + ecore_timer_reset(handle->timer); + else + handle->timer = ecore_timer_add(handle->timeout, + _timer_cb, handle); +} + static Eina_Bool _event_occured(void *data, int type, void *event) { struct timeout_handler *handle; @@ -66,7 +75,7 @@ static Eina_Bool _event_occured(void *data, int type, void *event) handle->event_cb(handle->event_data, type, event); - timeout_handler_reset(handle); + _timer_reset(handle); return ECORE_CALLBACK_PASS_ON; } @@ -75,26 +84,14 @@ void timeout_handler_enable(struct timeout_handler *handle, bool enable) { handle->enable = enable; - if (!enable) { + if (enable) { + _timer_reset(handle); + } else { ecore_timer_del(handle->timer); handle->timer = NULL; } } -void timeout_handler_reset(struct timeout_handler *handle) -{ - if (!handle) { - _ERR("invalid parameter"); - return; - } - - if (handle->timer) - ecore_timer_reset(handle->timer); - else - handle->timer = ecore_timer_add(handle->timeout, - _timer_cb, handle); -} - struct timeout_handler *timeout_handler_init(double timeout, timeout_event_cb timeout_cb, void *timeout_data, timeout_event_cb event_cb, void *event_data) @@ -125,10 +122,6 @@ struct timeout_handler *timeout_handler_init(double timeout, handle->list = eina_list_append(handle->list, ev); } - handle->timer = ecore_timer_add(timeout, _timer_cb, handle); - if (!handle->timer) - goto error; - handle->event_cb = event_cb; handle->event_data = event_data; handle->timeout_cb = timeout_cb; diff --git a/src/view/viewer.c b/src/view/viewer.c index b0ac6ca..886ad6e 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -936,7 +936,6 @@ static void _show(void *view_data) _viewer_show(priv, DIR_NONE); timeout_handler_enable(priv->timeout, true); - timeout_handler_reset(priv->timeout); evas_object_show(priv->base); } -- 2.7.4 From bdff73a4c5d6a9c684d9108a4f1690b700cb00f2 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 10 Jul 2015 19:38:10 +0900 Subject: [PATCH 13/16] add missing ifdef Change-Id: Ia5bd6e1ce8c7df72cb6e379036b096a71fec9e50 Signed-off-by: Minkyu Kang --- include/util/controller.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/util/controller.h b/include/util/controller.h index 6c3cead..3f24bf2 100644 --- a/include/util/controller.h +++ b/include/util/controller.h @@ -14,6 +14,9 @@ * limitations under the License. */ +#ifndef __AIR_MEDIAHUB_CONTROLLER_H__ +#define __AIR_MEDIAHUB_CONTROLLER_H__ + struct controller; struct controller_ops { @@ -36,3 +39,5 @@ struct controller { struct controller *controller_create(Evas_Object *base); void controller_destroy(struct controller *m); + +#endif -- 2.7.4 From 7eab6d79a70a64fcb61e365ca233de201124027c Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 13 Jul 2015 10:34:40 +0900 Subject: [PATCH 14/16] viewer: show the thumbnail when finished playing video Change-Id: Ic5b79cd51c682739a0be579f331e8de4b42a78de Signed-off-by: Minkyu Kang --- src/view/viewer.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/view/viewer.c b/src/view/viewer.c index 886ad6e..61745c1 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -62,6 +62,7 @@ struct _viewer { struct _playlist { Eina_List *list; int cur; + int dir; }; struct _priv { @@ -425,7 +426,7 @@ static void _set_played_position(struct _priv *priv, int position) _ERR("failed to update db"); } -static bool _viewer_show(struct _priv *priv, int foc) +static bool _viewer_show(struct _priv *priv) { struct _viewer_info *info; struct controller *ctl; @@ -459,7 +460,7 @@ static bool _viewer_show(struct _priv *priv, int foc) ctl->ops->show(ctl->handle); - switch (foc) { + switch (priv->playlist.dir) { case DIR_PREV: loc = 0; break; @@ -549,7 +550,9 @@ static bool _viewer_prev(struct _priv *priv) else priv->playlist.cur--; - r = _viewer_show(priv, DIR_PREV); + priv->playlist.dir = DIR_PREV; + + r = _viewer_show(priv); return r; } @@ -568,7 +571,9 @@ static bool _viewer_next(struct _priv *priv) else priv->playlist.cur++; - r = _viewer_show(priv, DIR_NEXT); + priv->playlist.dir = DIR_NEXT; + + r = _viewer_show(priv); return r; } @@ -727,11 +732,13 @@ static void _player_complete_cb(void *data) priv = data; - progressbar_stop(priv->progress); _set_played_position(priv, 0); + _player_stop(priv); if (priv->viewer.cur == VIEWER_MOVIE) _pop_view(priv); + else if (priv->viewer.cur == VIEWER_VIDEO) + _viewer_show(priv); } static void _player_set_position_cb(void *data) @@ -892,6 +899,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->playlist.list = NULL; priv->playlist.cur = 0; + priv->playlist.dir = DIR_NONE; player = playermgr_create(win); if (!player) { @@ -933,7 +941,7 @@ static void _show(void *view_data) media_content_connect(); - _viewer_show(priv, DIR_NONE); + _viewer_show(priv); timeout_handler_enable(priv->timeout, true); @@ -980,6 +988,7 @@ static void _update(void *view_data, int update_type, void *data) priv->playlist.list = vdata->list; priv->playlist.cur = vdata->index; + priv->playlist.dir = DIR_NONE; } static void _destroy(void *view_data) -- 2.7.4 From 48977dfe497b72f9f4bf073085576fe16f8702ab Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 10 Jul 2015 19:02:57 +0900 Subject: [PATCH 15/16] listmgr: add recently watched item Change-Id: I862616f03727be375aa3966d350e433a8201faae Signed-off-by: Jehun Lim --- include/util/listmgr.h | 22 ++++-- res/edc/widgets/button.edc | 38 +++++++++- src/layout/gallery.c | 25 ++++--- src/layout/movie.c | 176 ++++++++++++++++++++++++++++++++++++++++++--- src/util/listmgr.c | 115 ++++++++++++++++++++++++----- 5 files changed, 333 insertions(+), 43 deletions(-) diff --git a/include/util/listmgr.h b/include/util/listmgr.h index ad0a8ce..121c97e 100644 --- a/include/util/listmgr.h +++ b/include/util/listmgr.h @@ -19,6 +19,19 @@ struct listmgr; +struct play_info_ops { + bool (*draw)(void *data, Evas_Object *base); + bool (*update)(void *data, Evas_Object *base); + void *ops_data; +}; + +struct grid_ops { + struct grid_class *gclass; + + void (*selected_cb)(void *data, Elm_Object_Item *it); + void *ops_data; +}; + struct listmgr_data { int grid_item_x; int grid_item_y; @@ -26,16 +39,15 @@ struct listmgr_data { int box_padding; - struct grid_class *gclass; - - void (*grid_selected_cb)(void *data, Elm_Object_Item *it); - void *cb_data; + struct play_info_ops *pops; + struct grid_ops *gops; }; struct listmgr *listmgr_create(Evas_Object *base, void *data); void listmgr_destroy(struct listmgr *listmgr); bool listmgr_draw_list_area(struct listmgr *lmgr); -bool listmgr_update_list_area(struct listmgr *lmgr, Eina_List *list); +bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list); +bool listmgr_update_play_info(struct listmgr *lmgr, app_media_info *info); #endif /* __AIR_MEDIAHUB_LISTMGR_H__ */ diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index e35692a..ea45e4b 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -606,8 +606,6 @@ group { description { state: "default" 0.0; min: 740 614; - fixed: 1 1; - visible: 0; } } part { @@ -1004,6 +1002,16 @@ group { min: 100 20; align: 0.0 0.0; fixed: 1 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } } part { @@ -1025,6 +1033,15 @@ group { min: 100 20; align: 1.0 0.0; fixed: 1 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; } } part { @@ -1057,6 +1074,15 @@ group { min: 0 30; align: 0.5 0.0; fixed: 0 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; } } part { @@ -1065,7 +1091,7 @@ group { scale: 1; description { state: "default" 0.0; - visible: 0; + color: 0 0 0 0; } } } @@ -1087,6 +1113,9 @@ group { name: "focus,in,anim"; action: STATE_SET "selected" 0.0; target: PART_RECENT_CONTENT_THUMBNAIL; + target: PART_RECENT_CONTENT_PROGRESS; + target: PART_RECENT_CONTENT_TOTAL; + target: PART_RECENT_CONTENT_SLIDER; target: "default_image"; target: "part_focus1"; target: "part_focus2"; @@ -1124,6 +1153,9 @@ group { name: "focus,out,anim,2"; action: STATE_SET "default" 0.0; target: PART_RECENT_CONTENT_THUMBNAIL; + target: PART_RECENT_CONTENT_PROGRESS; + target: PART_RECENT_CONTENT_TOTAL; + target: PART_RECENT_CONTENT_SLIDER; target: "default_image"; target: "part_focus1"; target: "part_focus2"; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 61607c2..673a280 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -128,24 +128,32 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it) 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) { - _ERR("failed to allocate listmgr data"); - return NULL; - } + if (!data) + goto err; 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; - data->gclass = &_gclass; + gops = calloc(1, sizeof(*gops)); + if (!gops) + goto err; + + gops->gclass = &_gclass; + gops->selected_cb = _grid_selected_cb; + gops->ops_data = priv; - data->grid_selected_cb = _grid_selected_cb; - data->cb_data = priv; + data->gops = gops; return data; + +err: + _ERR("failed to allocate memory"); + return NULL; } static void _update_list_area(struct _priv *priv) @@ -162,7 +170,7 @@ static void _update_list_area(struct _priv *priv) return; } - if (!listmgr_update_list_area(priv->listmgr, list)) + if (!listmgr_update_content_list(priv->listmgr, list)) _ERR("failed to update list area"); priv->media_list = list; @@ -265,6 +273,7 @@ static void _destroy(void *layout_data) mediadata_destroy(priv->md); listmgr_destroy(priv->listmgr); + free(priv->ldata->gops); free(priv->ldata); evas_object_del(priv->layout); diff --git a/src/layout/movie.c b/src/layout/movie.c index a3fa193..31b18ca 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -26,11 +26,13 @@ #include "view.h" #include "data/mediadata.h" #include "util/listmgr.h" +#include "util/progressbar.h" #include "util/util.h" #define LIST_MEDIA_COND "media_type=1 AND copyright NOT LIKE \"Unknown\"" #define TEXT_NOCONTENT "No Movies" +#define TEXT_RECENTLY_WATCHED "Recently watched" #define GRID_ITEM_X 404 #define GRID_ITEM_Y 320 @@ -50,7 +52,11 @@ struct _priv { struct mediadata *md; + struct progressbar *prog; + Eina_List *media_list; + + app_media_info *recent_info; }; static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) @@ -115,6 +121,132 @@ static struct grid_class _gclass = { .content_get = _grid_content_get }; +static bool _update_recent(void *data, Evas_Object *base) +{ + Evas_Object *recent, *image; + app_media_info *info; + struct _priv *priv; + char buf[32]; + + if (!data || !base) { + _ERR("invalid argument"); + return false; + } + + priv = data; + + recent = elm_object_part_content_get(base, PART_ITEM_CONTENT); + if (!recent) { + _ERR("failed to get recent content part"); + return false; + } + + image = elm_object_part_content_get(recent, + PART_RECENT_CONTENT_THUMBNAIL); + if (!image) { + _ERR("failed to get image object"); + return false; + } + + info = priv->recent_info; + + elm_image_file_set(image, info->thumbnail_path, NULL); + elm_image_aspect_fixed_set(image, EINA_FALSE); + + elm_object_part_text_set(recent, PART_RECENT_CONTENT_TITLE, + info->title); + + util_time_string(buf, sizeof(buf), info->played_time); + elm_object_part_text_set(recent, PART_RECENT_CONTENT_DATE, buf); + + progressbar_reset(priv->prog, info->video->position, + info->video->duration); + + progressbar_show(priv->prog); + + return true; +} + +static bool _draw_recent_title(Evas_Object *base) +{ + Evas_Object *btn; + + btn = elm_button_add(base); + if (!btn) { + _ERR("failed to create button object"); + return false; + } + + elm_object_style_set(btn, STYLE_BTN_INDEX); + elm_object_text_set(btn, TEXT_RECENTLY_WATCHED); + + elm_object_part_content_set(base, PART_ITEM_TITLE, btn); + + return true; +} + +static bool _draw_recent_content(struct _priv *priv, Evas_Object *base) +{ + Evas_Object *btn, *image; + struct progressbar *prog; + + btn = elm_button_add(base); + if (!btn) { + _ERR("failed to create button object"); + return false; + } + + elm_object_style_set(btn, STYLE_BTN_RECENT_CONTENT); + + image = elm_image_add(btn); + if (!image) { + _ERR("failed to create image object"); + return false; + } + + elm_object_part_content_set(btn, PART_RECENT_CONTENT_THUMBNAIL, image); + + elm_object_part_content_set(base, PART_ITEM_CONTENT, btn); + + prog = progressbar_create(btn, STYLE_BASE_PROGRESS); + if (!prog) { + _ERR("failed to create progressbar"); + return false; + } + + progressbar_set_parts(prog, PART_RECENT_CONTENT_SLIDER, + PART_RECENT_CONTENT_TOTAL, + PART_RECENT_CONTENT_PROGRESS, ""); + + priv->prog = prog; + + return true; +} + +static bool _draw_recent(void *data, Evas_Object *base) +{ + struct _priv *priv; + + if (!data || !base) { + _ERR("invalid argument"); + return false; + } + + priv = data; + + if (!_draw_recent_title(base)) { + _ERR("failed to draw recent title"); + return false; + } + + if (!_draw_recent_content(priv, base)) { + _ERR("failed to draw recent content"); + return false; + } + + return true; +} + static void _grid_selected_cb(void *data, Elm_Object_Item *it) { app_media *am; @@ -144,27 +276,45 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it) static struct listmgr_data *_create_listmgr_data(struct _priv *priv) { struct listmgr_data *data; + struct play_info_ops *pops; + struct grid_ops *gops; data = calloc(1, sizeof(*data)); - if (!data) { - _ERR("failed to allocate listmgr data"); - return NULL; - } + if (!data) + goto err; 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; - data->gclass = &_gclass; + pops = calloc(1, sizeof(*pops)); + if (!pops) + goto err; + + pops->draw = _draw_recent; + pops->update = _update_recent; + pops->ops_data = priv; + + gops = calloc(1, sizeof(*gops)); + if (!gops) + goto err; + + gops->gclass = &_gclass; + gops->selected_cb = _grid_selected_cb; + gops->ops_data = priv; - data->grid_selected_cb = _grid_selected_cb; - data->cb_data = priv; + data->pops = pops; + data->gops = gops; return data; + +err: + _ERR("failed to allocate memory"); + return NULL; } -static void _update_list_area(struct _priv *priv) +static void _update_content_list(struct _priv *priv) { Eina_List *list; @@ -178,8 +328,10 @@ static void _update_list_area(struct _priv *priv) return; } - if (!listmgr_update_list_area(priv->listmgr, list)) + if (!listmgr_update_content_list(priv->listmgr, list)) { _ERR("failed to update list area"); + return; + } priv->media_list = list; } @@ -277,10 +429,14 @@ static void _destroy(void *layout_data) priv = layout_data; + progressbar_destroy(priv->prog); + mediadata_free_list(priv->media_list); mediadata_destroy(priv->md); listmgr_destroy(priv->listmgr); + free(priv->ldata->pops); + free(priv->ldata->gops); free(priv->ldata); evas_object_del(priv->layout); @@ -330,7 +486,7 @@ static void _update(void *layout_data, int update_type, void *data) priv = layout_data; - _update_list_area(priv); + _update_content_list(priv); } static layout_class _lclass = { diff --git a/src/util/listmgr.c b/src/util/listmgr.c index c45b6ec..652e00c 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -15,7 +15,9 @@ */ #include +#include #include +#include #include #include @@ -24,12 +26,19 @@ #include "util/listmgr.h" #include "util/util.h" +enum _object_type { + LISTMGR_GRID = 0, +}; + struct listmgr { Evas_Object *base; Evas_Object *box; + Evas_Object *play_info; struct gridmgr *gmgr; struct listmgr_data *data; + + Eina_Bool show_play_info; }; void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, @@ -40,34 +49,37 @@ void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!obj || !ev) return; - it = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, - ev->cur.canvas.y, NULL, NULL); + switch (id) { + case LISTMGR_GRID: + it = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL, NULL); - if (!it) - return; + if (!it) + return; - if (elm_object_item_focus_get(it)) - return; + if (!elm_object_item_focus_get(it)) + elm_object_item_focus_set(it, EINA_TRUE); - elm_object_item_focus_set(it, EINA_TRUE); + break; + default: + break; + } } void _grid_selected_cb(void *data, Elm_Object_Item *it, const char *emission, const char *source) { struct listmgr *lmgr; - struct listmgr_data *ldata; + struct grid_ops *gops; if (!data || !it) return; lmgr = data; - ldata = lmgr->data; + gops = lmgr->data->gops; - if (ldata->grid_selected_cb) - ldata->grid_selected_cb(ldata->cb_data, it); - - elm_gengrid_item_selected_set(it, EINA_FALSE); + if (gops->selected_cb) + gops->selected_cb(gops->ops_data, it); } void _grid_realized_cb(int id, void *data, Evas_Object *obj, @@ -90,7 +102,7 @@ void _grid_unrealized_cb(int id, void *data, Evas_Object *obj, SIG_SOURCE_EDC, _grid_selected_cb); } -static input_handler grid_handler = { +static input_handler _grid_handler = { .mouse_move = _mouse_move_cb, .realized = _grid_realized_cb, .unrealized = _grid_unrealized_cb @@ -107,6 +119,32 @@ static int _get_grid_size(int count, int num_item) return size; } +static bool _draw_play_info(struct listmgr *lmgr) +{ + Evas_Object *ly; + struct play_info_ops *pops; + + ly = elm_layout_add(lmgr->box); + if (!ly) { + _ERR("failed to create layout object"); + return false; + } + + elm_layout_file_set(ly, EDJEFILE, GRP_LIST_ITEM); + + pops = lmgr->data->pops; + + if (!pops->draw(pops->ops_data, ly)) { + _ERR("failed to draw play info item"); + evas_object_del(ly); + return false; + } + + lmgr->play_info = ly; + + return true; +} + static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) { Evas_Object *ly, *btn, *grid; @@ -140,7 +178,7 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) return NULL; } - if (!gridmgr_add_grid(lmgr->gmgr, gi->name, grid, data->gclass)) { + if (!gridmgr_add_grid(lmgr->gmgr, gi->name, grid, data->gops->gclass)) { _ERR("failed to add grid"); evas_object_del(ly); return NULL; @@ -151,7 +189,7 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) evas_object_size_hint_min_set(grid, size * data->grid_item_x, data->grid_num_item * data->grid_item_y); - inputmgr_add_callback(grid, 0, &grid_handler, lmgr); + inputmgr_add_callback(grid, LISTMGR_GRID, &_grid_handler, lmgr); elm_object_part_content_set(ly, PART_ITEM_TITLE, btn); elm_object_part_content_set(ly, PART_ITEM_CONTENT, grid); @@ -159,7 +197,7 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) return ly; } -bool listmgr_update_list_area(struct listmgr *lmgr, Eina_List *list) +bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list) { Evas_Object *ly; Eina_List *l; @@ -190,6 +228,40 @@ bool listmgr_update_list_area(struct listmgr *lmgr, Eina_List *list) return true; } +bool listmgr_update_play_info(struct listmgr *lmgr, app_media_info *info) +{ + struct play_info_ops *pops; + + if (!lmgr) { + _ERR("invalid argument"); + return false; + } + + if (!info) { + if (lmgr->show_play_info) { + elm_box_unpack(lmgr->box, lmgr->play_info); + evas_object_hide(lmgr->play_info); + lmgr->show_play_info = EINA_FALSE; + } + return true; + } + + pops = lmgr->data->pops; + + if (!pops->update(pops->ops_data, lmgr->play_info)) { + _ERR("failed to update play info"); + return false; + } + + if (!lmgr->show_play_info) { + elm_box_pack_start(lmgr->box, lmgr->play_info); + evas_object_show(lmgr->play_info); + lmgr->show_play_info = EINA_TRUE; + } + + return true; +} + bool listmgr_draw_list_area(struct listmgr *lmgr) { Evas_Object *scr, *box; @@ -221,6 +293,14 @@ bool listmgr_draw_list_area(struct listmgr *lmgr) lmgr->box = box; + if (lmgr->data->pops) { + if (!_draw_play_info(lmgr)) { + _ERR("failed to draw play info"); + evas_object_del(scr); + return false; + } + } + return true; } @@ -250,6 +330,7 @@ struct listmgr *listmgr_create(Evas_Object *base, void *data) lmgr->base = base; lmgr->gmgr = gmgr; lmgr->data = (struct listmgr_data *)data; + lmgr->show_play_info = EINA_FALSE; return lmgr; } -- 2.7.4 From f1a322d08d29905d5df62e748044f318f550c4ce Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Mon, 13 Jul 2015 21:58:55 +0900 Subject: [PATCH 16/16] listmgr: focus to recently played content when viewer view is popped Change-Id: I07ce24107e97c7415d608e8892d662d306788669 Signed-off-by: Jehun Lim --- include/util/listmgr.h | 2 ++ src/layout/gallery.c | 19 ++++++++++++++++++- src/layout/movie.c | 19 ++++++++++++++++++- src/util/listmgr.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/view/base.c | 28 +++++++++++++++++++++++++++- 5 files changed, 108 insertions(+), 3 deletions(-) diff --git a/include/util/listmgr.h b/include/util/listmgr.h index 121c97e..7272023 100644 --- a/include/util/listmgr.h +++ b/include/util/listmgr.h @@ -50,4 +50,6 @@ bool listmgr_draw_list_area(struct listmgr *lmgr); bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list); bool listmgr_update_play_info(struct listmgr *lmgr, app_media_info *info); +bool listmgr_update_focus_item(struct listmgr *lmgr, int index); + #endif /* __AIR_MEDIAHUB_LISTMGR_H__ */ diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 673a280..ed45631 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -315,6 +315,7 @@ 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"); @@ -323,7 +324,23 @@ static void _update(void *layout_data, int update_type, void *data) priv = layout_data; - _update_list_area(priv); + 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 = { diff --git a/src/layout/movie.c b/src/layout/movie.c index 31b18ca..1944c65 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -478,6 +478,7 @@ 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"); @@ -486,7 +487,23 @@ static void _update(void *layout_data, int update_type, void *data) priv = layout_data; - _update_content_list(priv); + switch (update_type) { + case UPDATE_CONTENT: + _update_content_list(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 = { diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 652e00c..b2f0511 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -197,6 +197,49 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) return ly; } +bool listmgr_update_focus_item(struct listmgr *lmgr, int index) +{ + Eina_List *item, *l; + Evas_Object *ly, *grid; + Elm_Object_Item *it; + int count; + + item = elm_box_children_get(lmgr->box); + if (lmgr->show_play_info) + item = eina_list_next(item); + + grid = NULL; + EINA_LIST_FOREACH(item, l, ly) { + grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); + if (!grid) { + _ERR("failed to get grid object"); + return false; + } + + count = elm_gengrid_items_count(grid); + + if (index < count) + break; + + index -= count; + } + + it = elm_gengrid_first_item_get(grid); + while (index--) + it = elm_gengrid_item_next_get(it); + + if (!it) { + _ERR("failed to get current grid item"); + return false; + } + + elm_gengrid_item_bring_in(it, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE); + elm_object_focus_set(grid, EINA_TRUE); + elm_object_item_focus_set(it, EINA_TRUE); + + return true; +} + bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list) { Evas_Object *ly; diff --git a/src/view/base.c b/src/view/base.c index 7185c77..8e92b44 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -22,6 +22,7 @@ #include "define.h" #include "layout.h" +#include "view.h" #define TITLE_TEXT "Media Hub" @@ -92,7 +93,8 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, layoutmgr_hide_layout(priv->lmgr, g_menu_item[priv->current_layout].layout_id); layoutmgr_show_layout(priv->lmgr, g_menu_item[i].layout_id); - layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id, 0, NULL); + layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id, + UPDATE_CONTENT, NULL); priv->focused_btn = obj; priv->current_layout = i; @@ -257,6 +259,29 @@ static void _hide(void *view_data) evas_object_hide(priv->base); } +static void _update(void *view_data, int update_type, void *data) +{ + struct _priv *priv; + struct view_update_data *vdata; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + if (!data) { + _ERR("invalid argument"); + return; + } + + priv = view_data; + vdata = data; + + layoutmgr_update_layout(priv->lmgr, + g_menu_item[priv->current_layout].layout_id, + UPDATE_FOCUS, (void *)&vdata->index); +} + static void _destroy(void *view_data) { struct _priv *priv; @@ -288,6 +313,7 @@ static view_class _vclass = { .create = _create, .show = _show, .hide = _hide, + .update = _update, .destroy = _destroy, }; -- 2.7.4