From 9e4393c020e2dddc2198a726fdfb200267b90447 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 10 Jul 2015 15:50:38 +0900 Subject: [PATCH 01/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 02/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 03/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 04/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 05/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 06/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 From f11761a48cea6074d2d642c01bf3f7016e1cbdf7 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 14 Jul 2015 13:07:09 +0900 Subject: [PATCH 07/16] listmgr: set scroller step size Change-Id: I700b1b5d26f658493078af050ee23b825126c13c Signed-off-by: Jehun Lim --- src/util/listmgr.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/util/listmgr.c b/src/util/listmgr.c index b2f0511..3b0c86f 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -26,6 +26,8 @@ #include "util/listmgr.h" #include "util/util.h" +#define SCROLLER_STEP_SIZE(x) ((x) + 10) + enum _object_type { LISTMGR_GRID = 0, }; @@ -320,6 +322,9 @@ bool listmgr_draw_list_area(struct listmgr *lmgr) return false; } + elm_scroller_step_size_set(scr, + SCROLLER_STEP_SIZE(lmgr->data->box_padding), 0); + box = util_add_box(scr); if (!box) { _ERR("failed to create box object"); -- 2.7.4 From 20c9fb84fbb5a83b8769680b1b8cb1541c59b676 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 14 Jul 2015 14:59:19 +0900 Subject: [PATCH 08/16] listmgr: set current state of selected item to false Change-Id: I7f8180254fd5a714f9d9a27e2e4cc3ee3fd5cdb0 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 3b0c86f..42f1a2f 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -82,6 +82,8 @@ void _grid_selected_cb(void *data, Elm_Object_Item *it, if (gops->selected_cb) gops->selected_cb(gops->ops_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 8554fc7c7f97f5ee05563f137853357efc365588 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 14 Jul 2015 20:11:02 +0900 Subject: [PATCH 09/16] modify the width of index button to be flexible Change-Id: I5bc5f3e2524e2cd9be96f69db3a0c6aae7665ba5 Signed-off-by: Jehun Lim --- res/edc/widgets/button.edc | 48 ++++++++++++++++++++++++++++++++++++++-------- src/util/listmgr.c | 5 ++++- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index ea45e4b..f203cd3 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -127,7 +127,6 @@ group { group { name: "elm/button/base/base_btn_index"; - inherit: "elm/button/base/base_btn_menu"; data.item: "focus_highlight" "on"; parts { part { @@ -135,9 +134,18 @@ group { scale: 1; description { state: "default" 0.0; - min: 0 36; color: 0 0 0 0; - fixed: 0 1; + } + } + part { + name: "bg_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "elm.text"; + rel2.to: "elm.text"; + color: 0 0 0 0; } description { state: "focused" 0.0; @@ -152,16 +160,20 @@ group { description { state: "default" 0.0; rel1.to: "bg"; - rel2.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } text { font: FONT_LIGHT; size: 36; - align: 0.0 0.5; + min: 1 0; + align: 0.0 0.7; + ellipsis: -1; } - min: 82 0; - align: 0.0 0.5; - color: COLOR_TEXT_INDEX; + min: 0 36; align: 0.0 0.0; + color: COLOR_TEXT_INDEX; fixed: 1 1; } description { @@ -172,6 +184,26 @@ group { } } } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "bg_text"; + target: "elm.text"; + transition: LINEAR TRANSITION_TIME; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_text"; + target: "elm.text"; + transition: LINEAR TRANSITION_TIME; + } + } } group { diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 42f1a2f..efc3e28 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -154,6 +154,7 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) Evas_Object *ly, *btn, *grid; struct listmgr_data *data; int size; + char buf[128]; data = lmgr->data; @@ -173,7 +174,9 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) } elm_object_style_set(btn, STYLE_BTN_INDEX); - elm_object_text_set(btn, gi->name); + + snprintf(buf, sizeof(buf), " %s ", gi->name); + elm_object_text_set(btn, buf); grid = util_add_gengrid(ly, data->grid_item_x, data->grid_item_y); if (!grid) { -- 2.7.4 From 77da0b23237a8e86097ed1487808e970e1c3d5ff Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:19:14 +0900 Subject: [PATCH 10/16] add music player images Change-Id: I5c1158bc90fb396d0665706e640af53dcfd2c497 Signed-off-by: Minkyu Kang --- res/edc/images/btn_music_contr_next_foc.png | Bin 0 -> 3506 bytes res/edc/images/btn_music_contr_next_nor.png | Bin 0 -> 3514 bytes res/edc/images/btn_music_contr_one_mode_foc.png | Bin 0 -> 2147 bytes res/edc/images/btn_music_contr_one_mode_nor.png | Bin 0 -> 2188 bytes res/edc/images/btn_music_contr_pause_foc.png | Bin 0 -> 3131 bytes res/edc/images/btn_music_contr_pause_nor.png | Bin 0 -> 3091 bytes res/edc/images/btn_music_contr_play_foc.png | Bin 0 -> 3233 bytes res/edc/images/btn_music_contr_play_nor.png | Bin 0 -> 3241 bytes res/edc/images/btn_music_contr_previous_foc.png | Bin 0 -> 3510 bytes res/edc/images/btn_music_contr_previous_nor.png | Bin 0 -> 3514 bytes res/edc/images/btn_music_contr_repeat_foc.png | Bin 0 -> 3866 bytes res/edc/images/btn_music_contr_repeat_nor.png | Bin 0 -> 3896 bytes res/edc/images/btn_music_contr_shuffle_dis.png | Bin 0 -> 1888 bytes res/edc/images/btn_music_contr_shuffle_dis_foc.png | Bin 0 -> 3657 bytes res/edc/images/btn_music_contr_shuffle_nor.png | Bin 0 -> 3737 bytes res/edc/images/btn_music_contr_shuffle_nor_foc.png | Bin 0 -> 3679 bytes 16 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/edc/images/btn_music_contr_next_foc.png create mode 100644 res/edc/images/btn_music_contr_next_nor.png create mode 100644 res/edc/images/btn_music_contr_one_mode_foc.png create mode 100644 res/edc/images/btn_music_contr_one_mode_nor.png create mode 100644 res/edc/images/btn_music_contr_pause_foc.png create mode 100644 res/edc/images/btn_music_contr_pause_nor.png create mode 100644 res/edc/images/btn_music_contr_play_foc.png create mode 100644 res/edc/images/btn_music_contr_play_nor.png create mode 100644 res/edc/images/btn_music_contr_previous_foc.png create mode 100644 res/edc/images/btn_music_contr_previous_nor.png create mode 100644 res/edc/images/btn_music_contr_repeat_foc.png create mode 100644 res/edc/images/btn_music_contr_repeat_nor.png create mode 100644 res/edc/images/btn_music_contr_shuffle_dis.png create mode 100644 res/edc/images/btn_music_contr_shuffle_dis_foc.png create mode 100644 res/edc/images/btn_music_contr_shuffle_nor.png create mode 100644 res/edc/images/btn_music_contr_shuffle_nor_foc.png diff --git a/res/edc/images/btn_music_contr_next_foc.png b/res/edc/images/btn_music_contr_next_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..d374f6cecae3b0e4f42286ba3989fd5bd0127f4b GIT binary patch literal 3506 zcmb`JS2Wy<7RLWV^xj1X(MOAZ)L}-i!Cn>*X8h``F9ZkIw)Kh^}PSk0{}u6 zk(LOU%d(}z*!{f+bj@`JShw( z0qk@5*+|N=06rFvWNpAp6{wrCex?J!?*OcxMgz*gyd-ePz{XP_c+(2>Ofu3m0hF}B z9rNS_F@P)_a2^p52m#^?0ao2Z8?~R}4UAi$tE38>)Y=4sRk!$ykV*Q6$w|d@G`*ALPB%I6wyW#<<>pka zpC$mT21ZU_N=P@~h*l+!_PKl|v`^-BkEZMiA=R^qL9+!Y+g`N6`~97b&dbcUg@w(H zjd{ZXh`r0GO~fUl&#A}e;^FT|wR6Jp*AHugF|v*^dSoYG`^JxqD{f9br;2x7`j(-0 z-bzC}=b61dVBp#Y2eGc3GyA7&7p384D{iMio{J3%%@Ez!a1v*v8aM^u%>xaR@GQw{ zM>o=6Mk0*xz@9Y%033Gs_I?(nB#ripTb&9f9)K_O%7lPuPlMJo8qh3yl9`c*L*Oz)}&YczGA%X*a5Jm{Kd-Tl!XR*3ih-l)(8y=9e^k+>T z`5tqx#B4u$sXnXs^y+>Lr!JJGy`r5lRAgEslq@d%i^(Le&)@>-lpKW#C;YwoWX!38 zd>@lp&2JlJDd@{sJcIFB>GK?_2V7H5a?owhQXK(gW6u*i^<;8ln#|Qd)3!j{s+DfU z>%OA-@FSl5wuq#V0Vy$vQ~j?w9%QX~t8@VW46>BEiTrt|vMd^ZKO(qPuq!g>sGrpZG|^26Cf+LvDk6ga6Q;8tJO(|N6voP1Iuafg#r> z}sshUOpNs;nI9J_&0Mg6PX*&ALQUWEIN z-vis3mUDSc^FP_ljBV?E&;L$(6iiE($QC!8j1c82=A__6a0PQV78qA@&8Bh=tYlG8Fn+!9i%yQ?{&8>RiKI;aqNzG^_?yiCRI?SmCY4U>P;{EF&6pt>i4%Yp6cw z)movDcXuthEfF=U)k!EswJ!|(I@0zch1|B^xZe!=+Pv(o(|YF+AB`JVbBF}LH(hPw zlNf~o;kOeDPlG@m1s6OWsp_bjm&#B%Lphsf3w(|zm}0%a|D+_)lxj<~Djy&DY=!ke zY)y>2Qr@^t#>2rIm6x9fuhp+LuhrY_Qf%0(LRNO^bl9H7&}$7Fia3bqAu=YfBeyIU zESIaOtJqD{RgN2^P~H{XFFUk@yB}5U7nFXu7hP)XTeT9}wRL(kLiz%B;d5GbtVatc zZ>AL_$I?!6stqdm`>OFs4`Y9tLmm4yp%pH_z0uKNu6 z43!I$3-b#bne3SC7g?CJRf<)r8mk%)PmE8znwTq8C{~yGBD+<*Rs5wG*XnE+Vkd#F zM!)wkXxgx=wB1K{K1#4twyl6$**P}r)+6hM<~r&-s+g+UOtVdEOXm>%Z+@abqH9{Y z-fYg3V;j&u=m-~tD+i)=u%UlHyDK}QJ>t&`bqczq1^QYZJD$kL?*dp=tW{QuCQJ6g z5rap0+tLX56ywyq+&Y?NOl;sj(z19~55a+GdmM*PPE9e29h1t}kSgXLS{~`zFbq8Q zcU%pdIYt&Y7x(Q|V;lDs_wVl~Exj0*e<4zG-;Z>duP4jLsu zbSH)pr-7N{m*F{k5}`u&4ap>0lMC$FHV^J*~8|HZ3--jM)0v&E9%`uaO^_ z_56gbg2}AO`}7HSBfrmmqHy`Rh)S&q2;RoFL9zJOexkj@d z&QTye;^-IpaPt!Qr^pBjsv=~9v>}f)WEWtwQ)S-PmeTduA(~8r{ z^H2v6uj!#a$RzCfkE~9GP{BdD3W?3Oc#)dSPGdUbr7Y>#BR8+@$6oilts>yDpw+O=F($@s7FII~v>DLgKwkV@1805V5=TWzW$JE^UizaXC#ya%-@q zJZoUZa^$l`&5JIDY;q_0j&>I=<-Dt@9cXi(@|^M9{phfCx^uq2%#ozMqvgpj-)xO@h4||KDL|)A{)DRE*czYprON8dUHC9x!XV)o$G#jHAaXG| z*0B&QvR~h6*6DPlxu>-NT~5M)?Jt++50;`H^aPjTr}(<#X#xJ+ zO->Sf^>6aI>06ipK$s8!M8^TZZ{iiV0pQ6U0N8N`0F?p&;P8F!G^h&z*Om>mwO}EO zKd|blyjGmitKoxvAnPFZ`#;#oQd~#RNx)jyWpa}f6!V_*+3kSu!eFq6348MHj?kXh z>4{~PhAeZk!frAGbgMH&!)+Mq1x7Wz1Vzo2*^#21gt=syH zg0cSvN@lHCJ|@9`LMxM!nJk6xpZH&=zkUDhG}5tBg~|G}`Ia@oc6IfK@vJ)yu>d8G zp~0*qF3@0_F+#P0ko16erwuAr%N+r~R(GBr=P0P~>mf5+v9o>{K$G!lG$W&Njyha!gh)uWO2_IBhahnm z*Nb=G?XDfn-HY#}dD`N?U%X>3LmiLPmkl?v3(pI^ZeR!Hp#y?PQ&Z z1k(|wN7e_{W)GA7Tf?-|Oh?QkeJ-U=$4A@jF{%@|C|r}SR{CE$#}A%FY%aA3tvQOb zZctKSb}_@;o`n3ZL0sLm+y>>@m>h1AvufvJ=RN0j<(~{(l+%y+-GHQ6vCB bB$5Jl%~7F$d9B)B9R*;ZW2)T%agO~LLVkBZ literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_next_nor.png b/res/edc/images/btn_music_contr_next_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..e1276337bcddd3ab1580c1084c5fd199b210d820 GIT binary patch literal 3514 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_one_mode_foc.png b/res/edc/images/btn_music_contr_one_mode_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2dd2a92935aff3e3b2750fe1ee02fdda629f75 GIT binary patch literal 2147 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 F{{ojHOwj-U literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_pause_foc.png b/res/edc/images/btn_music_contr_pause_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a2ec9064110307708216cb5dcc3c47a46f3500 GIT binary patch literal 3131 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_play_foc.png b/res/edc/images/btn_music_contr_play_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad74d8da3d90f31c6e2b58b7f3f859b6748de76 GIT binary patch literal 3233 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_play_nor.png b/res/edc/images/btn_music_contr_play_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..ef767b679671cd0b7981f31257365d8ec2a65dc3 GIT binary patch literal 3241 zcma);S2P^@7Ki^r7`?YBXOw8c=%Sk$W%OVKkwiB{L_N_$#)uY)648y2L@!a25xoW> z2%?S>JqYemLZZx-`*P1cPxoQ(Z~b2OTKil3VaHuF)u*SqL<0bzH$drFob&a0B|s?8 zdn@i0^Es$}P`3U6(6at6GLV(S1ptki2NHShn!9&^x4*l$57YpOg!=e-yLsGo1t4e| zZ;3%$u5)M{&g~Q3$m4$gubf5lfIq0UY|BotD5gDc~UbaCH=5@kg1VWWesZ z06SS;GJvwW#_9lfHBdfu{jn~vkpXOOMqMgkQVPfzSi7M>RUK#>WTLGB5IP`Z9vdYN zC_;fluaHm>c$5j)^meV)|GHAiv?g(GDziqtURXsp!VV(kOJ!{>%`Y}+zrsFXlpu$S6sr6dVDIW3*743+t41F#Sf zK71w#tG$F(qr`fhy}Z0l;eMMo@6W?{w;D$6cOY+l+Ir9Dw;SF3r246;mF4A0!!CrK zW1n@{8K%R&&HD82&v5mV!-KCai^36dw<7c@j=pw$+BYuX9ePIn$Z2LZQU9clmUO~5 zD%fS*pX|jzfq=4^;6J;bxYQb{4vhGV& z*UQNp;|`pMsskxlB6QoRl_&xcP)B|^%Es8nbP`nzT?ioyz|Yla-$ z>Q$D-Y;iuCSuybjq9UJQ@y0x+m{sA=ER}&s4g;ftikGRQm)tqs4?W&|3us`TP31RD z|7<EnX#71nCWe0 zBSDaOz@FSklWLeMlFB0iLzk2mmd=&ZTJ2f&qZ3PRTZUEYS;<>2l~8|4E3+!aU)!|g zvBZ?96~~lfioMZVufuIm<0x%AjXTYdug&wS?U$Omp|sB2wLy{sp7dqWe?};FiBu0v zJ-9E?m~qP27_U)UlCOf4H|Hb$+`RUSHw<=)KK1%lbf8aXLs?5FOi830 zV}GKfsNITTeW%>_=?NpjTMbW%tiI4DW+w)zX%@*C3W0YE0dJO zN`e<5%n{?niK+Wg*}0w4oD$X$_ViSPiautFp^WbaU%3BUKQ`6ts&iR`Ion!cANJGM zVHlesrlCpsB?4=|c$Wv>GJ8}X!-=W)kKBumk2AvcOQ&l}XY+K=_BJmY1|0a_S_m0A zz-QNHcWf0C-)t*wdu+$dy!fQ>LOj=2-v4uFFY>GT%CHvgi&PoU`SNfxq*(;!-I@^0 z8J28aF;P`l5LkNXxWlRWL(}iYlID`S@|@h9t^FtEwz}TBezQ*RT>Gebz~NfP zVDg{`L)5kKZ{we-99JFVJHzQjqhg}0qqP!zVr?!B%cd&^4$mO{=XHMRr0L9MV`R-# z-bfiLN@$i!-%+1dZcu2@>Xvr1{WNBSw=uYD#H%7LQK@wAZp-}1)?Umaevx)5lrsa? zd&?&{f3Raes)(aRnnhAIP1`uu^y>3}!I>nAIi6hJWevQXKoi`-*MSj)4J!@DP9kqg z@SEN+%Um&?s|46hXsmYk$cs5%#mm}*w)Jsl7wOKauS#pvuqEx^n zg@D<>th(LrFL#ZqIs0%gz7EEpO7+pRHmUrgtrQIbQTPpgLu^8Vss`g~?bbRF*Qb(J zmV0Gj>r-tXF-bXR=LKntrGsVR8KEHB$XbfeX0^Hej!KQXZ!nQ&iT&c0=hB*D zB)rDV%C@Z2E5n;bLQFg(ZnyX0+TW3RZqi!OtVD%v&P;6GGP8l%&cAc~6^-Z7WRH7X z$wuT%XMZ>;HWReM6XV_2nmP0QZAn>Iy~~i>h}-(=oK&tILt1J2YC6L``l;!+^z+x> zZXNv4CBo7N#E6ZN1Z4fIR`vHyu0z zV0RE%yIFeKmRZMkPIe7upEQTZH|9c4^of5k<|wG!1{?07KYC2B<3>|3yF*X#srayP z>7O$W#FvE7HRr+kJB;2t4NL(GBf6ycHMJ(S!JE7919oeOE3DS!+IwvTY^a~5 zjGFZ{<}_wi*5CB3-wtVh7wUGn&XcP=IJ@5*{1*pld@NT*W43uO#QX5W;lVt|Y`CB3 z>0p23RG{c~MUz>R{l4}Vdoa+GmDFeWU0|2TS0C0Lgv;Uw60NED<9XL8@ z`a7}O0O`mTJuJEiButaLMUYqHr&X|)lkZWyf+ktm23!<5WMUP;^hNGxl)tuQRALON z%alk|7|bJFj*4+1wR zwCpObZ*H_q^DXXpDe>qZBF@$urmrWCW%@(>p2K=g4wOhgbeWf#q}S5@)LL^Oevtk< z8YD?PGD&E=-+zs18Fjon*24BWOdR#y2tJ*T>-rtypj*GgaaiyIFOJv4zGX5U_ZD`M z8h65|S=zW!8gf73GGJM%$>P=->>(>IlphuobsHRlYG;{h=G=u768CtVytg{!8aF?N=FK*$6J6AHNR?|u8O7XXiD z(KaZ!%{r$xX<;8~niTcI)ZdzeTF4rj62+b&E-g&Md?QJ?c!tBOhsD5vf^WDei99tm z>KTWX4EFNK%*PPUWQM$g_&=@6^;&`o1h-PH8i#>!TzQS_Bi zL6&c^L;ZtGD{^|#v|<5(nYzhSIOtTA3>-#kXKYk+B4pkRXVHU{<0pc}_b*9fTTfr3?1 zycD1a2d=}SqK`ma9$+`zMQHuHTFXq7zL->AqgIQUhC#F=wQL|20wE_Ti8JB4%C6>i z$t_<`t~WG~M=4r`>D%5X0E#j=F1p=2eS~AI#o^Rav5dE5H@Ya#Mcmz&&sN7U0eS!| z1xJpb$;dbHMqQ_j@;iHdWt+msg|6rUDaE^yN$(vfTAxMi1^hD`gW~j-nVHpD}LvS|_A~Z=K)8qLrMZjVKPk^?uqnE9D=1P7~)ox0Ysf(oA=L zBJf3|-^9HIDb2oY#TuBZpZ{!6sZ=Bx`dn(@%EY-C~uSJfdIJZi^;)1Ht7yg1E60N zEnN@c+wb9)>89lGxjffHcjBrR2Nmn@g)&2FJ)`*VyGm8ZKqV7K>jk7;<-h6)sB~NT zBxD9K%Jtg5XVea0I&z~f?2&AbrlEigQ?t1V&nA(%KSheBQgh|S9}4#vQ?RCp34KUn zw-PbUP&HPxehL?|H5S;_zJEz0(aEqiA;2*x_@v}Dfi!1kQ?lSHe8dT$@Ca$5UHle z4D#07Rg09wumf!u{?n;V@NMjk%N!BzrdFJpWSiia$Ycfnpq9y&3Ny8iX1nY$1#64@#b(zWn z6=Pn}%n!4kzKv8GFJy$S4#%&cSNc|zSNK+hcO7Zb?s|c54sE_mT7SHAgJ+d_Rb`dZ zD_03(Tas@*Ur`KaQB8Az))Zr{>#Pzh*i;_mYmCNnnwXZ>yw3W<>%-+kx?T4pxRqr- zOVA?cGh$+7-RMWo5AyvGdWHm!*r6npBu@c16*r0}gu5=+tc>SN3eON+L0xe(mzc+t z=WmOY#!5ft$oNQ`bt6kWi%(h}URhOEwNOQ8yJtHBPpfpXiKsQSRkm5Kr1_eSv8_Vi z+_d4dK~-L_NUTCt_``MIMB1MwQ`+~L^;yE+SQRzgT5cZ{qVwQsdL$$4%YaFE5UtuT z-Y`1z_@Q)L?x{dqigs0Hu?9@}hBBhbdhdm|F4b~w;Ni<)3mT$idCp$s(*^b&sqa#J zWh!PZie65>RoOY&NQ^PY3S+d{p;o(9jxOskXtO_#W`qpgkZ_VPLZ#s@qlq>%HuL4Q z<(%f)ng_LVRlcQs#clc_UH8hja|=6Nq6*FY%NIgBh)4Vp@~7}qzoYU4BYGrd6TKKE zfgZ=LHJ}>kuO%QqMEGR|bMDiFmAYlQBKqutc0v zTv*)He8YS@-`c#TOsed<*>$s_(NCkVM<$t4l>vZ?0YYh z#ubM$`)zFdy?6%=`%gL9K%4Z7yaWLr&JIZJtqMWzL&a1zy5{|oy8TiMK0zdB7x zsKxqWBivB#T&U)O+P>|~j?9SGh(AxYsTdMx7%>740+B&)@3U*#X)fgBUT*6~4D4sG z%cGEE%wyBa%UHG%ss7t&n}RP!C@xe>Q0!h(O0sFph+K}2Tmj$U{BXz0jo^bo=cTZT z19U-CLGM-tp>A7k`}TI?+^bJ2ucQj?m4iO_4a2@!t&Z!`y~)YGHBzjf}vTGmr@cO%PW()GHs0G3SNsFn8S?#G2_8I<}UL#B* z=HfDNw;AJaM*f)mOy#!bmeLnVFA<*@k4Vr>4M;-rjw|MJG|z+ke6%(MXfKru-Um(zR;$?shJoZ0#j}M}MbV4(H01 zA9fB1Eynfk$Cq7%B3=^EpZZ+>Fs6=X7dG_g`D{hh5VGXH9HhzpJ${8LaT($ zGqI=*)SCChk!r8_#3y@<)wq zOySkhtxruK3F+!DcV3-uvG%eqJ;#)cQhKc0z(P3%N&=lCfHF{YrTJp zmG;A1Vzv-DwUHg-VdlQkE)7PDiKJVbT(y3feeCC4W8oLLHAFr^eo7_Eh@EQriWivB zhFhmiUfnce9Qvd4480Q~%b> zzXQ$R%{MHt$v<{TDjVWGBEL@amfuG3hSpi; z7t5ixmu>mAEl$2I+hHB=!o5lBe1+<``TdU2U!3QY_(Bcs`HsCXf6@TyV3Bh^^1j3= zZlrA{L}I(9-Ln1GzTOsO1~#9F*L6Ibo8Fmwa;H0_Xm5PZh(sA5J9d_Fkj4bNoR*h1 zlE9F#S$IuHL*u*d{nPc6a@d&Xn0O)A+3T~BS}soc$V2?*6mC3syf|k!C$r1%ap~zs z_a;vrVX${lu=B$sWkr{LyW_2%khu_nosvZ+%azAMPbANMem5N0d@euE~T8+6-eXvMhx=%MH(5>Q2KG<#+ae7ZP6vsdJ_n{PlL)n~qtGniUcw#PYwO zNEU*mQ?vdXLdFy{G5YEM1_eaKm{~05|KPusE_DA#>AbnHrW5HgAB4Y52w5C-Z>XnB zBMxk|-D#TTMmF0=ICiMK$HlE=q$1SI-`fdZ!Y6MGNf}c7p2i}GRXZ3o`Q}609E@eT zM`2g!ASXRRSzx@5sW!ansBG4k&V0Cqzvdpp;QJa)TW7Ws8VzE6c=&@zzkrpl34wzS9F12#l$H%*tmY#F4vw>s$pHGAhDQ@fX&zv(9$S(F? zYc!85@0G{<;!9Ph{AZvLoS*Me{3+z%_}eTw-V%E=J;)JG#57|TDJSPE7b zO?;sb4!?DLYuFgE3wK-=oQQLpnU|_f!{|~@o+_Lgw|ZanC$aiNMK*-VtTp`AtBC26 zTloC+7$*Xq?BW_fFa2hX)LKVOu;fb(;5aFf?%c};WA<>D}aiGhWFEz~vUKl4j+MF0Q* literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_previous_nor.png b/res/edc/images/btn_music_contr_previous_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..5ebae5424518e8b66d3c24e0276b1881e1f9845c GIT binary patch literal 3514 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 BdEx*7 literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_repeat_foc.png b/res/edc/images/btn_music_contr_repeat_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..41acbe58d3c5b64928a53fb968d075327216baad GIT binary patch literal 3866 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_repeat_nor.png b/res/edc/images/btn_music_contr_repeat_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..00092ce3991cdef990cead22529dabde8b9b4840 GIT binary patch literal 3896 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 QttP-o&s?`c$K~OF0LO$YDF6Tf literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_shuffle_dis.png b/res/edc/images/btn_music_contr_shuffle_dis.png new file mode 100644 index 0000000000000000000000000000000000000000..145d4b96a23a5ab1bbd208e50fb4a11fe8f2611f GIT binary patch literal 1888 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_shuffle_nor.png b/res/edc/images/btn_music_contr_shuffle_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..19d2544ec6682d65f08af5292b9eab4482c9f2c9 GIT binary patch literal 3737 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 Nprc`+j)vGr{|6oP?l=Gd literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_music_contr_shuffle_nor_foc.png b/res/edc/images/btn_music_contr_shuffle_nor_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4046184b4f33b6fcf7cff6bdd7005769c8debd GIT binary patch literal 3679 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 F;$Lth-uD0i literal 0 HcmV?d00001 -- 2.7.4 From 96522dcab78d4c9d67ae8b7d9c88567147de0b05 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:22:13 +0900 Subject: [PATCH 11/16] playermgr: support non-displayed player Change-Id: I3f3f645d2f4a3b42b613a19e5d3e2dc61a53460c Signed-off-by: Minkyu Kang --- src/util/playermgr.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/util/playermgr.c b/src/util/playermgr.c index 332eebd..8adbdd8 100644 --- a/src/util/playermgr.c +++ b/src/util/playermgr.c @@ -174,17 +174,20 @@ bool playermgr_play(struct playermgr *m, const char *path, int ms) return false; } - r = player_set_display(m->player, PLAYER_DISPLAY_TYPE_OVERLAY, - GET_DISPLAY(m->win)); - if (r != PLAYER_ERROR_NONE) { - _ERR("player: set_display error (%d)", r); - return false; - } - - r = player_set_display_mode(m->player, PLAYER_DISPLAY_MODE_FULL_SCREEN); - if (r != PLAYER_ERROR_NONE) { - _ERR("player: set_display_mode error (%d)", r); - return false; + if (m->win) { + r = player_set_display(m->player, PLAYER_DISPLAY_TYPE_OVERLAY, + GET_DISPLAY(m->win)); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set_display error (%d)", r); + return false; + } + + r = player_set_display_mode(m->player, + PLAYER_DISPLAY_MODE_FULL_SCREEN); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set_display_mode error (%d)", r); + return false; + } } r = player_prepare(m->player); @@ -199,10 +202,12 @@ bool playermgr_play(struct playermgr *m, const char *path, int ms) 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; + if (ms) { + 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; @@ -227,11 +232,6 @@ struct playermgr *playermgr_create(Evas_Object *win) struct playermgr *m; int r; - if (!win) { - _ERR("invalid parameter"); - return NULL; - } - m = calloc(1, sizeof(*m)); if (!m) { _ERR("failed to allocate"); -- 2.7.4 From 6ad1635a9596f5f939cf394f806535f3d5d2cdec Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:23:23 +0900 Subject: [PATCH 12/16] add music player controller buttons Change-Id: Ie708bc04fc6c5fe69933ed3a4009d350ebafb11e Signed-off-by: Minkyu Kang --- res/edc/widgets/button.edc | 240 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index f203cd3..f44bb68 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -625,6 +625,246 @@ group { } group { + name: "elm/button/base/music_btn_prev"; + inherit: "elm/button/base/viewer_btn_prev"; + images { + image: IMAGE_MUSIC_PREV_NORMAL COMP; + image: IMAGE_MUSIC_PREV_FOCUS COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 164 142; + image { + normal: IMAGE_MUSIC_PREV_NORMAL; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + image { + normal: IMAGE_MUSIC_PREV_FOCUS; + } + } + } + } + programs { + program { + name: "emit,signal"; + action: SIGNAL_EMIT SIG_BTN_CALLBACK SRC_BTN_MUSIC_PREV; + } + } +} + +group { + name: "elm/button/base/music_btn_next"; + inherit: "elm/button/base/music_btn_prev"; + images { + image: IMAGE_MUSIC_NEXT_NORMAL COMP; + image: IMAGE_MUSIC_NEXT_FOCUS COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + image { + normal: IMAGE_MUSIC_NEXT_NORMAL; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + image { + normal: IMAGE_MUSIC_NEXT_FOCUS; + } + } + } + } + programs { + program { + name: "emit,signal"; + action: SIGNAL_EMIT SIG_BTN_CALLBACK SRC_BTN_MUSIC_NEXT; + } + } +} + +group { + name: "elm/button/base/music_btn_play"; + inherit: "elm/button/base/music_btn_prev"; + images { + image: IMAGE_MUSIC_PLAY_NORMAL COMP; + image: IMAGE_MUSIC_PLAY_FOCUS COMP; + image: IMAGE_MUSIC_PAUSE_NORMAL COMP; + image: IMAGE_MUSIC_PAUSE_FOCUS COMP; + } + script { + public cur_state; + } + parts { + part { + name: "color"; + description { + state: "default_pause" 0.0; + } + description { + state: "selected_pause" 0.0; + color: COLOR_ITEM_FOCUS; + } + } + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + image { + normal: IMAGE_MUSIC_PLAY_NORMAL; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + image { + normal: IMAGE_MUSIC_PLAY_FOCUS; + } + } + description { + state: "default_pause" 0.0; + inherit: "default" 0.0; + image { + normal: IMAGE_MUSIC_PAUSE_NORMAL; + } + } + description { + state: "selected_pause" 0.0; + inherit: "default" 0.0; + image { + normal: IMAGE_MUSIC_PAUSE_FOCUS; + } + } + } + } + programs { + program { + name: "load"; + signal: "load"; + source: ""; + script { + set_int(cur_state, STATE_PLAY); + } + } + program { + name: SIG_SET_PLAY; + signal: SIG_SET_PLAY; + source: ""; + script { + set_int(cur_state, STATE_PLAY); + set_state(PART:"bg", "default", 0.0); + set_state(PART:"color", "default", 0.0); + } + } + program { + name: SIG_SET_PAUSE; + signal: SIG_SET_PAUSE; + source: ""; + script { + set_int(cur_state, STATE_PAUSE); + set_state(PART:"bg", "default_pause", 0.0); + set_state(PART:"color", "default_pause", 0.0); + } + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: SIG_BTN_CLICKED; + signal: SIG_BTN_CLICKED; + source: ""; + after: "emit,signal"; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_PLAY) { + set_int(cur_state, STATE_PAUSE); + set_state(PART:"bg", "selected_pause", 0.0); + } else { + set_int(cur_state, STATE_PLAY); + set_state(PART:"bg", "selected", 0.0); + } + } + } + program { + name: "emit,signal"; + action: SIGNAL_EMIT SIG_BTN_CALLBACK SRC_BTN_MUSIC_PLAY; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_PLAY) + run_program(PROGRAM:"focused,play"); + else + run_program(PROGRAM:"focused,pause"); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_PLAY) + run_program(PROGRAM:"unfocused,play"); + else + run_program(PROGRAM:"unfocused,pause"); + } + } + program { + name: "focused,play"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "color"; + transition: LINEAR TRANSITION_TIME; + } + program { + name: "focused,pause"; + action: STATE_SET "selected_pause" 0.0; + target: "bg"; + target: "color"; + transition: LINEAR TRANSITION_TIME; + } + program { + name: "unfocused,play"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "color"; + transition: LINEAR TRANSITION_TIME; + } + program { + name: "unfocused,pause"; + action: STATE_SET "default_pause" 0.0; + target: "bg"; + target: "color"; + transition: LINEAR TRANSITION_TIME; + } + } +} + +group { name: "elm/button/base/base_btn_recent"; data.item, "focus_highlight" "on"; images { -- 2.7.4 From f1f38ed9fa57b5ba8c9f99684a032519bb164ac9 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:24:28 +0900 Subject: [PATCH 13/16] util: time_string: support various format Change-Id: If49cd57e7e1b7536f24c2361bad743d3368e954d Signed-off-by: Minkyu Kang --- include/util/util.h | 2 +- src/util/util.c | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/include/util/util.h b/include/util/util.h index ee354f7..c5b4afa 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -23,7 +23,7 @@ Evas_Object *util_add_gengrid(Evas_Object *base, Evas_Object *util_add_image(Evas_Object *base, const char *file); Evas_Object *util_add_scroller(Evas_Object *base); -void util_time_string(char *str, int size, unsigned int ms); +void util_time_string(char *str, int size, unsigned int ms, bool full); void util_up_string(char *str); int util_get_media_index(Eina_List *list, void *info); diff --git a/src/util/util.c b/src/util/util.c index ce88147..389d5cf 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include @@ -107,14 +108,25 @@ Evas_Object *util_add_scroller(Evas_Object *base) return scr; } -void util_time_string(char *str, int size, unsigned int ms) +void util_time_string(char *str, int size, unsigned int ms, bool full) { int sec; + int h, m, s; sec = ms / 1000; - snprintf(str, size, "%02d:%02d:%02d", - sec / 3600, (sec % 3600) / 60, sec % 60); + h = sec / 3600; + m = (sec % 3600) / 60; + s = sec % 60; + + if (full) { + snprintf(str, size, "%02d:%02d:%02d", h, m, s); + } else { + if (h) + snprintf(str, size, "%d:%02d:%02d", h, m, s); + else + snprintf(str, size, "%d:%02d", m, s); + } } void util_up_string(char *str) -- 2.7.4 From d0a4cccd4d1b681617cb2297dd351cc3fa2ce062 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:26:24 +0900 Subject: [PATCH 14/16] progressbar: add function for setting time format Change-Id: If9a302665dd320e951a4a766077c1e3ebfe5a282 Signed-off-by: Minkyu Kang --- include/util/progressbar.h | 7 +++++++ src/util/progressbar.c | 24 +++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/include/util/progressbar.h b/include/util/progressbar.h index 792dcc8..884761e 100644 --- a/include/util/progressbar.h +++ b/include/util/progressbar.h @@ -24,6 +24,11 @@ struct progressbar_ops { int (*set_value)(void *data); }; +enum progressbar_time_format { + PROG_TIME_FORMAT_FIT, /* eg) 7:17 - default */ + PROG_TIME_FORMAT_FULL, /* eg) 00:07:17 */ +}; + struct progressbar *progressbar_create(Evas_Object *base, const char *style); void progressbar_destroy(struct progressbar *m); @@ -31,6 +36,8 @@ void progressbar_set_parts(struct progressbar *m, const char *slider, const char *total, const char *progress, const char *separator); void progressbar_set_ops(struct progressbar *m, struct progressbar_ops *ops, void *data); +void progressbar_set_time_format(struct progressbar *m, + enum progressbar_time_format fmt); void progressbar_reset(struct progressbar *m, int position, int duration); void progressbar_show(struct progressbar *m); diff --git a/src/util/progressbar.c b/src/util/progressbar.c index 756c44a..b89b71e 100644 --- a/src/util/progressbar.c +++ b/src/util/progressbar.c @@ -39,13 +39,15 @@ struct progressbar { char *part_total; char *part_progress; char *str_separator; + + enum progressbar_time_format fmt; }; static void _update_progress_info(struct progressbar *m, int position) { char progress[32] = {0,}; - util_time_string(progress, sizeof(progress), position); + util_time_string(progress, sizeof(progress), position, m->fmt); elm_object_part_text_set(m->base, m->part_progress, progress); } @@ -54,7 +56,7 @@ static void _update_time_info(struct progressbar *m, int position, int duration) char str[32] = {0,}; char total[32] = {0,}; - util_time_string(str, sizeof(str), duration); + util_time_string(str, sizeof(str), duration, m->fmt); snprintf(total, sizeof(total), "%s%s", m->str_separator, str); elm_object_part_text_set(m->base, m->part_total, total); @@ -174,6 +176,17 @@ void progressbar_reset(struct progressbar *m, int position, int duration) _update_time_info(m, position, duration); } +void progressbar_set_time_format(struct progressbar *m, + enum progressbar_time_format fmt) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + m->fmt = fmt; +} + void progressbar_set_ops(struct progressbar *m, struct progressbar_ops *ops, void *data) { @@ -225,19 +238,20 @@ struct progressbar *progressbar_create(Evas_Object *base, const char *style) return NULL; } + if (style) + elm_object_style_set(obj, style); + elm_slider_indicator_show_set(obj, EINA_FALSE); elm_slider_indicator_show_on_focus_set(obj, EINA_FALSE); 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); m->base = base; m->slider = obj; + m->fmt = PROG_TIME_FORMAT_FIT; return m; } -- 2.7.4 From 6127bb18777c32d1117681c49c927c1b676d1802 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:26:56 +0900 Subject: [PATCH 15/16] movie: fixing for util_time_string function Change-Id: Ibe6d5b68ba23c18f0346faf2be8593da0166e245 Signed-off-by: Minkyu Kang --- src/layout/movie.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layout/movie.c b/src/layout/movie.c index 1944c65..8c69338 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -156,7 +156,7 @@ static bool _update_recent(void *data, Evas_Object *base) elm_object_part_text_set(recent, PART_RECENT_CONTENT_TITLE, info->title); - util_time_string(buf, sizeof(buf), info->played_time); + util_time_string(buf, sizeof(buf), info->played_time, false); elm_object_part_text_set(recent, PART_RECENT_CONTENT_DATE, buf); progressbar_reset(priv->prog, info->video->position, -- 2.7.4 From 7fe59b5f7fab012753b08cb20ca1284d3aaf442b Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:28:13 +0900 Subject: [PATCH 16/16] slider: add music progressbar style Change-Id: I4a30f957184c5e4c993fdd8530ae8abf804bfa6c Signed-off-by: Minkyu Kang --- res/edc/widgets/slider.edc | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/res/edc/widgets/slider.edc b/res/edc/widgets/slider.edc index 61a89a4..7bac3cc 100644 --- a/res/edc/widgets/slider.edc +++ b/res/edc/widgets/slider.edc @@ -241,6 +241,53 @@ group { } group { + name: "elm/slider/horizontal/music_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.5; + } + rel2 { + to: "bg"; + relative: 1.0 0.5; + } + min: 0 4; + fixed: 0 1; + align: 0.0 0.5; + color: COLOR_ITEM_BAR; + } + } + 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 0.0; + color: COLOR_ITEM_SELECTED; + } + } + } +} + +group { name: "elm/slider/horizontal/progress_indicator/default"; alias: "elm/slider/horizontal/popup/default"; parts { -- 2.7.4