From 96522dcab78d4c9d67ae8b7d9c88567147de0b05 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:22:13 +0900 Subject: [PATCH 01/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 02/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 03/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 04/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 05/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 06/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 From 756d7a7e989b001a9ed65aafa16c87302126ee9f Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 21:30:14 +0900 Subject: [PATCH 07/16] viewer: set time format to full mode for progressbar Change-Id: Ibdcb495c60c1665f50984b03e3934751d9fd82af Signed-off-by: Minkyu Kang --- src/view/viewer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/view/viewer.c b/src/view/viewer.c index 61745c1..6122536 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -666,7 +666,7 @@ static int _player_get_position(void *data) return playermgr_get_position(priv->player); } -struct progressbar_ops _progressbar_ops = { +static struct progressbar_ops _progressbar_ops = { .get_value = _player_get_position, }; @@ -837,6 +837,7 @@ static bool _ui_init(struct _priv *priv) progressbar_set_parts(prog, PART_VIEWER_SLIDER, PART_VIEWER_TOTAL, PART_VIEWER_PROGRESS, VIEWER_SEPARATOR); + progressbar_set_time_format(prog, PROG_TIME_FORMAT_FULL); progressbar_set_ops(prog, &_progressbar_ops, priv); priv->progress = prog; -- 2.7.4 From 8b565e4ce5f0370425274142cd861c345beb10a3 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 22:13:53 +0900 Subject: [PATCH 08/16] music player: add edc file Change-Id: I92a59937bf93a76627a72ea30fa2d6e79735c4b2 Signed-off-by: Minkyu Kang --- res/edc/mediahub.edc | 1 + res/edc/view/mplayer.edc | 438 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 439 insertions(+) create mode 100644 res/edc/view/mplayer.edc diff --git a/res/edc/mediahub.edc b/res/edc/mediahub.edc index 1366e00..448edc8 100644 --- a/res/edc/mediahub.edc +++ b/res/edc/mediahub.edc @@ -19,6 +19,7 @@ collections { #include "view/base.edc" #include "view/viewer.edc" + #include "view/mplayer.edc" #include "layout/movie.edc" #include "layout/gallery.edc" #include "layout/music.edc" diff --git a/res/edc/view/mplayer.edc b/res/edc/view/mplayer.edc new file mode 100644 index 0000000..e15fcda --- /dev/null +++ b/res/edc/view/mplayer.edc @@ -0,0 +1,438 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: GRP_MPLAYER_VIEW; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + + /* LEFT */ + part { + name: "leftarea"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.5 1.0; + } + align: 0.0 0.0; + fixed: 0 0; + } + } + part { + name: "leftarea_bg"; + type: RECT; + scale: 1; + clip_to: "leftarea"; + description { + state: "default" 0.0; + color: 255 255 255 255; + rel1.to: "leftarea"; + rel2.to: "leftarea"; + } + } + part { + name: "padding_top"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 376; + rel1 { + to: "leftarea"; + relative: 0.0 0.0; + } + rel2 { + to: "leftarea"; + relative: 1.0 0.0; + } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { + name: "padding_thumb"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 296; + rel1 { + to: "padding_top"; + relative: 0.0 1.0; + } + rel2 { + to: "padding_top"; + relative: 1.0 1.0; + } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { + name: PART_MPLAYER_THUMB; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 440 440; + rel1 { + to: "padding_top"; + relative: 0.5 1.0; + } + rel2 { + to: "padding_top"; + relative: 0.5 1.0; + } + fixed: 1 1; + align: 0.5 0.5; + } + } + part { + name: PART_MPLAYER_TITLE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 0 42; + rel1 { + to: "padding_thumb"; + relative: 0.0 1.0; + } + rel2 { + to: "padding_thumb"; + relative: 1.0 1.0; + } + text { + font: FONT_LIGHT; + size: 42; + align: 0.5 0.5; + } + color: COLOR_TEXT_TITLE; + fixed: 0 1; + align: 0.0 0.0; + } + } + part { + name: "padding_title"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 18; + rel1 { + to: PART_MPLAYER_TITLE; + relative: 0.0 1.0; + } + rel2 { + to: PART_MPLAYER_TITLE; + relative: 1.0 1.0; + } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { + name: PART_MPLAYER_INFO; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 0 30; + rel1 { + to: "padding_title"; + relative: 0.0 1.0; + } + rel2 { + to: "padding_title"; + relative: 1.0 1.0; + } + text { + font: FONT_LIGHT; + size: 30; + align: 0.5 0.5; + } + color: COLOR_TEXT_MENU; + fixed: 0 1; + align: 0.0 0.0; + } + } + part { + name: "padding_info"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 34; + rel1 { + to: PART_MPLAYER_INFO; + relative: 0.0 1.0; + } + rel2 { + to: PART_MPLAYER_INFO; + relative: 1.0 1.0; + } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { + name: "controls_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 820 142; + rel1 { + to: "padding_info"; + relative: 0.5 1.0; + } + rel2 { + to: "padding_info"; + relative: 0.5 1.0; + } + fixed: 1 1; + align: 0.5 0.0; + visible: 0; + } + } + part { + name: "control_btn0"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 164 142; + rel1 { + to: "controls_bg"; + relative: 0.0 0.5; + } + rel2 { + to: "controls_bg"; + relative: 0.0 0.5; + } + fixed: 1 1; + align: 0.0 0.5; + } + } + part { + name: "control_btn1"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 164 142; + rel1 { + to: "control_btn0"; + relative: 1.0 0.5; + } + rel2 { + to: "control_btn0"; + relative: 1.0 0.5; + } + fixed: 1 1; + align: 0.0 0.5; + } + } + part { + name: "control_btn2"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 164 142; + rel1 { + to: "control_btn1"; + relative: 1.0 0.5; + } + rel2 { + to: "control_btn1"; + relative: 1.0 0.5; + } + fixed: 1 1; + align: 0.0 0.5; + } + } + part { + name: "control_btn3"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 164 142; + rel1 { + to: "control_btn2"; + relative: 1.0 0.5; + } + rel2 { + to: "control_btn2"; + relative: 1.0 0.5; + } + fixed: 1 1; + align: 0.0 0.5; + } + } + part { + name: "control_btn4"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 164 142; + rel1 { + to: "control_btn3"; + relative: 1.0 0.5; + } + rel2 { + to: "control_btn3"; + relative: 1.0 0.5; + } + fixed: 1 1; + align: 0.0 0.5; + } + } + part { + name: "padding_control"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 28; + rel1 { + to: "controls_bg"; + relative: 0.0 1.0; + } + rel2 { + to: "controls_bg"; + relative: 1.0 1.0; + } + fixed: 0 1; + align: 0.0 0.0; + } + } + part { + name: PART_MPLAYER_SLIDER; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 698 28; + rel1 { + to: "padding_control"; + relative: 0.5 1.0; + } + rel2 { + to: "padding_control"; + relative: 0.5 1.0; + } + fixed: 1 1; + align: 0.5 0.0; + } + } + part { + name: PART_MPLAYER_PROGRESS; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 86 28; + rel1 { + to: PART_MPLAYER_SLIDER; + relative: 0.0 0.0; + } + rel2 { + to: PART_MPLAYER_SLIDER; + relative: 0.0 0.0; + } + text { + font: FONT_LIGHT; + size: 28; + align: 0.0 0.5; + } + color: COLOR_TEXT_SELECTED; + fixed: 0 1; + align: 1.0 0.0; + } + } + part { + name: PART_MPLAYER_TOTAL; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 86 28; + rel1 { + to: PART_MPLAYER_SLIDER; + relative: 1.0 0.0; + } + rel2 { + to: PART_MPLAYER_SLIDER; + relative: 1.0 0.0; + } + text { + font: FONT_LIGHT; + size: 28; + align: 1.0 0.5; + } + color: COLOR_TEXT_MENU; + fixed: 0 1; + align: 0.0 0.0; + } + } + + /* RIGHT */ + part { + name: "rightarea"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.5 0.0; + } + rel2 { + relative: 1.0 1.0; + } + align: 0.0 0.0; + fixed: 0 0; + } + } + part { + name: "rightarea_bg"; + type: RECT; + scale: 1; + clip_to: "rightarea"; + description { + state: "default" 0.0; + color: COLOR_BASE_BG; + rel1.to: "rightarea"; + rel2.to: "rightarea"; + } + } + } +} -- 2.7.4 From ccc471584c065597dbb7e1efb297faa35235a932 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 14 Jul 2015 22:15:53 +0900 Subject: [PATCH 09/16] music player: add music player view Change-Id: I4ab9399d12ae01d2abe72b966700753c941413e6 Signed-off-by: Minkyu Kang --- CMakeLists.txt | 1 + include/define.h | 2 + include/view.h | 3 + include/view/mplayer.h | 61 +++++++ src/main.c | 2 + src/view/mplayer.c | 474 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 543 insertions(+) create mode 100644 include/view/mplayer.h create mode 100644 src/view/mplayer.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 08e5efd..49b3cad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,7 @@ SET(SRCS src/main.c src/view/base.c src/view/viewer.c +src/view/mplayer.c src/layout/movie.c src/layout/gallery.c src/layout/music.c diff --git a/include/define.h b/include/define.h index dd55262..73a2d81 100644 --- a/include/define.h +++ b/include/define.h @@ -20,6 +20,7 @@ /* views */ #include "view/base.h" #include "view/viewer.h" +#include "view/mplayer.h" /* layouts */ #include "layout/movie.h" @@ -45,6 +46,7 @@ #define COLOR_ITEM_FOCUS 0 119 246 255 #define COLOR_ITEM_FOCUS_0 0 119 246 0 #define COLOR_ITEM_SELECTED 64 136 211 255 +#define COLOR_ITEM_BAR 190 190 190 255 /* part */ #define PART_ELM_TEXT_TITLE "elm.text.title" diff --git a/include/view.h b/include/view.h index 18a07bf..3fec5db 100644 --- a/include/view.h +++ b/include/view.h @@ -23,6 +23,9 @@ view_class *view_base_get_vclass(void); /* viewer */ view_class *view_viewer_get_vclass(void); +/* music player */ +view_class *view_mplayer_get_vclass(void); + /* view data */ struct view_update_data { Eina_List *list; diff --git a/include/view/mplayer.h b/include/view/mplayer.h new file mode 100644 index 0000000..660e780 --- /dev/null +++ b/include/view/mplayer.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AIR_MEDIAHUB_VIEW_MPLAYER_H__ +#define __AIR_MEDIAHUB_VIEW_MPLAYER_H__ + +/* view */ +#define VIEW_MPLAYER "VIEW_MPLAYER" + +/* group */ +#define GRP_MPLAYER_VIEW "group.mplayer_view" + +/* style */ +#define STYLE_MPLAYER_PROGRESS "music_progress" + +/* part */ +#define PART_MPLAYER_BG "part.mplayer_bg" +#define PART_MPLAYER_THUMB "part.mplayer_thumb" +#define PART_MPLAYER_TITLE "part.mplayer_title" +#define PART_MPLAYER_INFO "part.mplayer_info" +#define PART_MPLAYER_PROGRESS "part.mplayer_progress" +#define PART_MPLAYER_TOTAL "part.mplayer_total" +#define PART_MPLAYER_SLIDER "part.mplayer_slider" + +/* source */ +#define SRC_BTN_MUSIC_SHUFFLE "shuffle" +#define SRC_BTN_MUSIC_REPEAT "repeat" +#define SRC_BTN_MUSIC_PREV "prev" +#define SRC_BTN_MUSIC_PLAY "play" +#define SRC_BTN_MUSIC_NEXT "next" + +/* images */ +#define IMAGE_MUSIC_PREV_FOCUS "btn_music_contr_previous_foc.png" +#define IMAGE_MUSIC_PREV_NORMAL "btn_music_contr_previous_nor.png" +#define IMAGE_MUSIC_PLAY_FOCUS "btn_music_contr_play_foc.png" +#define IMAGE_MUSIC_PLAY_NORMAL "btn_music_contr_play_nor.png" +#define IMAGE_MUSIC_PAUSE_FOCUS "btn_music_contr_pause_foc.png" +#define IMAGE_MUSIC_PAUSE_NORMAL "btn_music_contr_pause_nor.png" +#define IMAGE_MUSIC_NEXT_FOCUS "btn_music_contr_next_foc.png" +#define IMAGE_MUSIC_NEXT_NORMAL "btn_music_contr_next_nor.png" +#define IMAGE_MUSIC_SHUFFLE_FOCUS "btn_music_contr_shuffle_nor_foc.png" +#define IMAGE_MUSIC_SHUFFLE_NORMAL "btn_music_contr_shuffle_nor.png" +#define IMAGE_MUSIC_SHUFFLE_DIS_FOCUS "btn_music_contr_shuffle_dis_foc.png" +#define IMAGE_MUSIC_SHUFFLE_DIS_NORMAL "btn_music_contr_shuffle_dis.png" +#define IMAGE_MUSIC_REPEAT_FOCUS "btn_music_contr_repeat_foc.png" +#define IMAGE_MUSIC_REPEAT_NORMAL "btn_music_contr_repeat_nor.png" + +#endif diff --git a/src/main.c b/src/main.c index d68cc2a..7140ece 100644 --- a/src/main.c +++ b/src/main.c @@ -79,6 +79,7 @@ static bool _create(void *data) viewmgr_add_view(view_base_get_vclass(), NULL); viewmgr_add_view(view_viewer_get_vclass(), NULL); + viewmgr_add_view(view_mplayer_get_vclass(), NULL); elm_win_focus_highlight_enabled_set(win, EINA_TRUE); elm_win_focus_highlight_style_set(win, STYLE_INVISIBLE); @@ -101,6 +102,7 @@ static void _terminate(void *data) viewmgr_remove_view(VIEW_BASE); viewmgr_remove_view(VIEW_VIEWER); + viewmgr_remove_view(VIEW_MPLAYER); viewmgr_destroy(); diff --git a/src/view/mplayer.c b/src/view/mplayer.c new file mode 100644 index 0000000..6a16e4b --- /dev/null +++ b/src/view/mplayer.c @@ -0,0 +1,474 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "define.h" +#include "view.h" +#include "util/controller.h" +#include "util/playermgr.h" +#include "util/progressbar.h" +#include "util/util.h" + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +#define STYLE_MUSIC_BTN "music_btn" +#define PART_MUSIC_BTN "control_btn" +#define PLAY_BTN_LOC 2 + +struct _playlist { + Eina_List *list; + int cur; +}; + +struct _priv { + Evas_Object *win; + Evas_Object *base; + Evas_Object *thumb; + + struct _playlist playlist; + struct playermgr *player; + struct progressbar *progress; + struct controller *ctl; +}; + +struct _btn_info { + const char *name; + int loc; +}; + +static struct _btn_info btn_player[] = { + { + .name = SRC_BTN_MUSIC_PREV, + .loc = 1, + }, + { + .name = SRC_BTN_MUSIC_PLAY, + .loc = 2, + }, + { + .name = SRC_BTN_MUSIC_NEXT, + .loc = 3, + }, +}; + +/* 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) +{ + 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; + } + + snprintf(buf, sizeof(buf), "MEDIA_TYPE=3"); + + 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 */ + +static void _draw_thumbnail(struct _priv *priv, app_media_info *mi) +{ + elm_image_file_set(priv->thumb, mi->thumbnail_path, NULL); + elm_object_part_content_set(priv->base, + PART_MPLAYER_THUMB, priv->thumb); +} + +static void _draw_music_info(struct _priv *priv, app_media_info *mi) +{ + char buf[128] = {0,}; + + snprintf(buf, sizeof(buf), "%s / %s", + mi->audio->artist, mi->audio->album); + + elm_object_part_text_set(priv->base, PART_MPLAYER_TITLE, mi->title); + elm_object_part_text_set(priv->base, PART_MPLAYER_INFO, buf); +} + +static void _draw_progressbar(struct _priv *priv, app_media_info *mi) +{ + progressbar_reset(priv->progress, 0, mi->audio->duration); + progressbar_show(priv->progress); +} + +static app_media_info *_get_current_media_info(struct _priv *priv) +{ + app_media *am; + app_media_info *mi; + + am = eina_list_nth(priv->playlist.list, priv->playlist.cur); + if (!am) { + _ERR("failed to get app_media"); + return NULL; + } + + mi = app_media_get_info(am); + if (!mi) { + _ERR("failed to getting media info"); + return NULL; + } + + return mi; +} + +static void _mplayer_show(struct _priv *priv) +{ + struct controller *ctl; + app_media_info *mi; + + mi = _get_current_media_info(priv); + if (!mi) + _ERR("failed to getting media info"); + + ctl = priv->ctl; + ctl->ops->show(ctl->handle); + + _draw_thumbnail(priv, mi); + _draw_music_info(priv, mi); + _draw_progressbar(priv, mi); + + app_contents_recent_add(CONTENTS_MEDIA, mi->media_id); +} + +static void _mplayer_hide(struct _priv *priv) +{ + struct controller *ctl; + + ctl = priv->ctl; + ctl->ops->hide(ctl->handle); +} + +static void _mplayer_prev(struct _priv *priv) +{ + int total; + + total = eina_list_count(priv->playlist.list); + + if (priv->playlist.cur == 0) + priv->playlist.cur = total - 1; + else + priv->playlist.cur--; + + _mplayer_show(priv); +} + +static void _mplayer_next(struct _priv *priv) +{ + int total; + + total = eina_list_count(priv->playlist.list); + + if (priv->playlist.cur == total - 1) + priv->playlist.cur = 0; + else + priv->playlist.cur++; + + _mplayer_show(priv); +} + +static int _player_get_position(void *data) +{ + struct _priv *priv; + + if (!data) + return 0; + + priv = data; + + return playermgr_get_position(priv->player); +} + +static struct progressbar_ops _progressbar_ops = { + .get_value = _player_get_position, +}; + +static void _player_complete_cb(void *data) +{ + /* TODO */ +} + +static void _callback_music(void *data, const char *ev) +{ + struct _priv *priv; + + if (!data || !ev) + return; + + priv = data; + + if (!strcmp(ev, SRC_BTN_MUSIC_PREV)) { + _mplayer_prev(priv); + } else if (!strcmp(ev, SRC_BTN_MUSIC_NEXT)) { + _mplayer_next(priv); + } else if (!strcmp(ev, SRC_BTN_MUSIC_PLAY)) { + /* TODO */ + } +} + +static bool _ui_init(struct _priv *priv) +{ + struct controller *ctl; + struct progressbar *prog; + Evas_Object *obj; + int i; + + obj = elm_image_add(priv->base); + if (!obj) { + _ERR("failed to adding image"); + return false; + } + + priv->thumb = obj; + + ctl = controller_create(priv->base); + if (!ctl) { + _ERR("failed to create controller"); + return false; + } + + for (i = 0; i < ARRAY_SIZE(btn_player); i++) { + ctl->ops->add_control(ctl->handle, + btn_player[i].name, btn_player[i].loc, + STYLE_MUSIC_BTN, PART_MUSIC_BTN); + } + + ctl->ops->add_callback(ctl->handle, _callback_music, priv); + + priv->ctl = ctl; + + prog = progressbar_create(priv->base, STYLE_MPLAYER_PROGRESS); + if (!prog) { + _ERR("failed to adding progressbar"); + goto err; + } + + progressbar_set_parts(prog, PART_MPLAYER_SLIDER, PART_MPLAYER_TOTAL, + PART_MPLAYER_PROGRESS, ""); + progressbar_set_ops(prog, &_progressbar_ops, priv); + + priv->progress = prog; + + return true; + +err: + controller_destroy(ctl); + return false; +} + +static Evas_Object *_create(Evas_Object *win, void *data) +{ + struct _priv *priv; + Evas_Object *base; + struct playermgr *player; + bool r; + + if (!win) { + _ERR("failed to get win object"); + return NULL; + } + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + _ERR("failed to allocate priv"); + return NULL; + } + + base = elm_layout_add(win); + if (!base) { + _ERR("failed to create base object"); + free(priv); + return NULL; + } + + elm_layout_file_set(base, EDJEFILE, GRP_MPLAYER_VIEW); + + evas_object_size_hint_weight_set(base, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, base); + + priv->win = win; + priv->base = base; + + priv->playlist.list = NULL; + priv->playlist.cur = 0; + + player = playermgr_create(NULL); + if (!player) { + _ERR("failed to create player"); + return NULL; + } + + r = playermgr_set_completed_cb(player, _player_complete_cb, priv); + if (!r) { + _ERR("failed to set callback"); + playermgr_destroy(player); + return NULL; + } + + priv->player = player; + + r = _ui_init(priv); + if (!r) { + _ERR("failed to init UI"); + playermgr_destroy(player); + return NULL; + } + + /* FIXME */ + _media_test(priv); + + viewmgr_set_view_data(VIEW_MPLAYER, priv); + + return base; +} + +static void _show(void *view_data) +{ + struct _priv *priv; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + priv = view_data; + + media_content_connect(); + + _mplayer_show(priv); + + evas_object_show(priv->base); +} + +static void _hide(void *view_data) +{ + struct _priv *priv; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + priv = view_data; + + _mplayer_hide(priv); + + media_content_disconnect(); + + 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; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + priv = view_data; + + playermgr_destroy(priv->player); + + controller_destroy(priv->ctl); + progressbar_destroy(priv->progress); + + evas_object_del(priv->base); + + free(priv); +} + +static view_class _vclass = { + .view_id = VIEW_MPLAYER, + .create = _create, + .show = _show, + .hide = _hide, + .update = _update, + .destroy = _destroy, +}; + +view_class *view_mplayer_get_vclass(void) +{ + return &_vclass; +} -- 2.7.4 From ddec93f25aa58a672b0a6330f54ad6a19cdbc05c Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 15 Jul 2015 20:23:15 +0900 Subject: [PATCH 10/16] mplayer: set fix value correctly Change-Id: I9d08bf0444f68d28c2943c214e9880847b3a42a2 Signed-off-by: Minkyu Kang --- res/edc/view/mplayer.edc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/edc/view/mplayer.edc b/res/edc/view/mplayer.edc index e15fcda..1a4415f 100644 --- a/res/edc/view/mplayer.edc +++ b/res/edc/view/mplayer.edc @@ -375,7 +375,7 @@ group { align: 0.0 0.5; } color: COLOR_TEXT_SELECTED; - fixed: 0 1; + fixed: 1 1; align: 1.0 0.0; } } @@ -400,7 +400,7 @@ group { align: 1.0 0.5; } color: COLOR_TEXT_MENU; - fixed: 0 1; + fixed: 1 1; align: 0.0 0.0; } } -- 2.7.4 From 8a2a6b5dea2dc7b878d55260ecc6b7373ae55917 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 15 Jul 2015 20:32:04 +0900 Subject: [PATCH 11/16] progressbar: don't stop the progressbar when reset Change-Id: I77e8a3a0f5ab62009a033e825073cc6ed80d3fcf Signed-off-by: Minkyu Kang --- src/util/progressbar.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/util/progressbar.c b/src/util/progressbar.c index b89b71e..8e27037 100644 --- a/src/util/progressbar.c +++ b/src/util/progressbar.c @@ -167,8 +167,6 @@ void progressbar_reset(struct progressbar *m, int position, int duration) return; } - progressbar_stop(m); - elm_slider_value_set(m->slider, position); elm_slider_min_max_set(m->slider, 0, duration); elm_slider_step_set(m->slider, SLIDER_STEP); -- 2.7.4 From f61176309266a47a30b136b50f1134337ad0a011 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 15 Jul 2015 20:34:44 +0900 Subject: [PATCH 12/16] music player: support play/prev/next Change-Id: If18fa8fb9d5d87af51ef39f3292355e4f4e856e2 Signed-off-by: Minkyu Kang --- src/view/mplayer.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 6a16e4b..90a89cb 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -73,6 +73,10 @@ static struct _btn_info btn_player[] = { }, }; +static void _player_play(struct _priv *priv); +static void _player_stop(struct _priv *priv); +static void _player_next(struct _priv *priv); + /* FIXME: test function */ static bool _media(media_info_h media_h, void *dt) { @@ -240,9 +244,91 @@ static struct progressbar_ops _progressbar_ops = { .get_value = _player_get_position, }; +static void _player_play(struct _priv *priv) +{ + app_media_info *mi; + player_state_e state; + + playermgr_get_state(priv->player, &state); + + switch (state) { + case PLAYER_STATE_PAUSED: + progressbar_resume(priv->progress); + playermgr_resume(priv->player); + break; + case PLAYER_STATE_PLAYING: + progressbar_pause(priv->progress); + playermgr_pause(priv->player); + break; + case PLAYER_STATE_IDLE: + case PLAYER_STATE_READY: + mi = _get_current_media_info(priv); + if (!mi) { + _ERR("failed to getting media info"); + return; + } + + progressbar_start(priv->progress); + playermgr_play(priv->player, mi->file_path, 0); + + break; + default: + _ERR("player was not created"); + break; + } +} + +static void _player_next(struct _priv *priv) +{ + app_media_info *mi; + player_state_e state; + + playermgr_get_state(priv->player, &state); + + switch (state) { + case PLAYER_STATE_PAUSED: + case PLAYER_STATE_IDLE: + case PLAYER_STATE_READY: + progressbar_stop(priv->progress); + playermgr_stop(priv->player); + break; + case PLAYER_STATE_PLAYING: + mi = _get_current_media_info(priv); + if (!mi) { + _ERR("failed to getting media info"); + return; + } + + playermgr_play(priv->player, mi->file_path, 0); + break; + default: + _ERR("player was not created"); + break; + } +} + +static void _player_stop(struct _priv *priv) +{ + struct controller *ctl; + + progressbar_stop(priv->progress); + playermgr_stop(priv->player); + + ctl = priv->ctl; + ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); +} + static void _player_complete_cb(void *data) { - /* TODO */ + struct _priv *priv; + + if (!data) + return; + + priv = data; + + _mplayer_next(priv); + _player_next(priv); } static void _callback_music(void *data, const char *ev) @@ -256,10 +342,12 @@ static void _callback_music(void *data, const char *ev) if (!strcmp(ev, SRC_BTN_MUSIC_PREV)) { _mplayer_prev(priv); + _player_next(priv); } else if (!strcmp(ev, SRC_BTN_MUSIC_NEXT)) { _mplayer_next(priv); + _player_next(priv); } else if (!strcmp(ev, SRC_BTN_MUSIC_PLAY)) { - /* TODO */ + _player_play(priv); } } -- 2.7.4 From cf6895dc671e1705e7e05d6ad202a6eda90f8e97 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 15 Jul 2015 22:41:47 +0900 Subject: [PATCH 13/16] viewer: fix checkpatch errors Change-Id: I289be301dabbeb43029fd57c509368fcb3acef4e Signed-off-by: Minkyu Kang --- src/view/viewer.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/view/viewer.c b/src/view/viewer.c index 6122536..7680d3e 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -313,7 +313,7 @@ static void _draw_contents(struct _priv *priv, int id, app_media_info *mi) /* * set this photocam object to photo_pre (preloaded photo) * On "loaded" callback, photo_pre object will pass to photo - * On "loaded,detail" callback, photo_pre object will set to NULL + * On "loaded,detail" callback photo_pre object will set to NULL */ priv->photo_pre = obj; } @@ -697,7 +697,8 @@ static void _player_play(struct _priv *priv) _remove_thumbnail(priv); progressbar_start(priv->progress); - playermgr_play(priv->player, mi->file_path, mi->video->position); + playermgr_play(priv->player, mi->file_path, + mi->video->position); break; default: -- 2.7.4 From 9a8e7e96d3105c612e5259038f23f837d0ae385e Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 15 Jul 2015 22:04:16 +0900 Subject: [PATCH 14/16] base: add focus handling between menu button and thumbnail area Change-Id: Ib9fce52084db6b0b5ea730b6dd0bf20546f72dfc Signed-off-by: Jehun Lim --- include/util/listmgr.h | 2 + src/layout/gallery.c | 10 ++++ src/layout/movie.c | 10 ++++ src/util/listmgr.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++--- src/view/base.c | 43 +++++++++++---- 5 files changed, 189 insertions(+), 21 deletions(-) diff --git a/include/util/listmgr.h b/include/util/listmgr.h index 7272023..3567dd0 100644 --- a/include/util/listmgr.h +++ b/include/util/listmgr.h @@ -33,6 +33,8 @@ struct grid_ops { }; struct listmgr_data { + Evas_Object *menu_btn; + int grid_item_x; int grid_item_y; int grid_num_item; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index ed45631..8d396af 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -42,6 +42,7 @@ struct _priv { Evas_Object *base; Evas_Object *layout; + Evas_Object *menu_btn; layoutmgr *lmgr; @@ -134,6 +135,8 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) if (!data) goto err; + data->menu_btn = priv->menu_btn; + data->grid_item_x = GRID_ITEM_X; data->grid_item_y = GRID_ITEM_Y; data->grid_num_item = GRID_NUM_ITEM; @@ -189,12 +192,19 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } + if (!data) { + _ERR("invalid argument"); + return false; + } + priv = calloc(1, sizeof(*priv)); if (!priv) { _ERR("failed to allocate priv"); return false; } + priv->menu_btn = (Evas_Object *)data; + base = layoutmgr_get_base(lmgr); if (!base) { _ERR("failed to get base object"); diff --git a/src/layout/movie.c b/src/layout/movie.c index 1944c65..d6d3e8d 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -44,6 +44,7 @@ struct _priv { Evas_Object *base; Evas_Object *layout; Evas_Object *box; + Evas_Object *menu_btn; layoutmgr *lmgr; @@ -283,6 +284,8 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) if (!data) goto err; + data->menu_btn = priv->menu_btn; + data->grid_item_x = GRID_ITEM_X; data->grid_item_y = GRID_ITEM_Y; data->grid_num_item = GRID_NUM_ITEM; @@ -349,12 +352,19 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } + if (!data) { + _ERR("invalid argument"); + return false; + } + priv = calloc(1, sizeof(*priv)); if (!priv) { _ERR("failed to allocate priv"); return false; } + priv->menu_btn = (Evas_Object *)data; + base = layoutmgr_get_base(lmgr); if (!base) { _ERR("failed to get base object"); diff --git a/src/util/listmgr.c b/src/util/listmgr.c index efc3e28..63fad7f 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -29,29 +29,61 @@ #define SCROLLER_STEP_SIZE(x) ((x) + 10) enum _object_type { - LISTMGR_GRID = 0, + LISTMGR_SCROLLER = 0, + LISTMGR_INDEX, + LISTMGR_GRID }; struct listmgr { Evas_Object *base; + Evas_Object *scr; Evas_Object *box; Evas_Object *play_info; + Evas_Object *focused; struct gridmgr *gmgr; struct listmgr_data *data; Eina_Bool show_play_info; + Eina_Bool scr_focus; }; -void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (!obj || !ev) + return; + + switch (id) { + case LISTMGR_INDEX: + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) + elm_object_focus_next(obj, ELM_FOCUS_UP); + break; + default: + break; + } +} + +static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { Elm_Object_Item *it; + struct listmgr *lmgr; - if (!obj || !ev) + if (!data || !obj || !ev) return; + lmgr = data; + switch (id) { + case LISTMGR_INDEX: + if (!elm_object_focus_get(obj)) { + lmgr->scr_focus = EINA_FALSE; + elm_object_focus_set(obj, EINA_TRUE); + } + + break; case LISTMGR_GRID: it = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, ev->cur.canvas.y, NULL, NULL); @@ -59,8 +91,10 @@ void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!it) return; - if (!elm_object_item_focus_get(it)) + if (!elm_object_item_focus_get(it)) { + lmgr->scr_focus = EINA_FALSE; elm_object_item_focus_set(it, EINA_TRUE); + } break; default: @@ -68,7 +102,7 @@ void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, } } -void _grid_selected_cb(void *data, Elm_Object_Item *it, +static void _grid_selected_cb(void *data, Elm_Object_Item *it, const char *emission, const char *source) { struct listmgr *lmgr; @@ -86,7 +120,7 @@ void _grid_selected_cb(void *data, Elm_Object_Item *it, elm_gengrid_item_selected_set(it, EINA_FALSE); } -void _grid_realized_cb(int id, void *data, Evas_Object *obj, +static void _grid_realized_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *it) { if (!data || !it) @@ -96,7 +130,7 @@ void _grid_realized_cb(int id, void *data, Evas_Object *obj, SIG_SOURCE_EDC, _grid_selected_cb, data); } -void _grid_unrealized_cb(int id, void *data, Evas_Object *obj, +static void _grid_unrealized_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *it) { if (!it) @@ -106,12 +140,66 @@ void _grid_unrealized_cb(int id, void *data, Evas_Object *obj, SIG_SOURCE_EDC, _grid_selected_cb); } +static void _focused_cb(int id, void *data, Evas_Object *obj, + Elm_Object_Item *it) +{ + Evas_Object *btn; + struct listmgr *lmgr; + + if (!data || !obj) + return; + + lmgr = data; + + switch (id) { + case LISTMGR_SCROLLER: + if (!lmgr->scr_focus) + break; + + btn = elm_object_part_content_get(lmgr->focused, + PART_ITEM_TITLE); + if (!btn) { + _ERR("failed to get button object"); + return; + } + + elm_object_focus_set(btn, EINA_TRUE); + + break; + case LISTMGR_INDEX: + case LISTMGR_GRID: + lmgr->focused = elm_object_parent_widget_get(obj); + lmgr->scr_focus = EINA_TRUE; + break; + default: + break; + } +} + static input_handler _grid_handler = { .mouse_move = _mouse_move_cb, + .focused = _focused_cb, .realized = _grid_realized_cb, .unrealized = _grid_unrealized_cb }; +static input_handler _handler = { + .key_down = _key_down_cb, + .mouse_move = _mouse_move_cb, + .focused = _focused_cb +}; + +static Evas_Object *_get_box_first_item(Evas_Object *box) +{ + Eina_List *list; + + list = elm_box_children_get(box); + if (!list) + return NULL; + + return (Evas_Object *)eina_list_nth(list, 0); +} + static int _get_grid_size(int count, int num_item) { int size; @@ -178,6 +266,11 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) snprintf(buf, sizeof(buf), " %s ", gi->name); elm_object_text_set(btn, buf); + elm_object_focus_next_object_set(btn, + lmgr->data->menu_btn, ELM_FOCUS_UP); + + inputmgr_add_callback(btn, LISTMGR_INDEX, &_handler, lmgr); + grid = util_add_gengrid(ly, data->grid_item_x, data->grid_item_y); if (!grid) { _ERR("failed to create gengrid object"); @@ -241,7 +334,8 @@ bool listmgr_update_focus_item(struct listmgr *lmgr, int index) } elm_gengrid_item_bring_in(it, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE); - elm_object_focus_set(grid, EINA_TRUE); + + lmgr->scr_focus = EINA_FALSE; elm_object_item_focus_set(it, EINA_TRUE); return true; @@ -249,7 +343,7 @@ bool listmgr_update_focus_item(struct listmgr *lmgr, int index) bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list) { - Evas_Object *ly; + Evas_Object *ly, *btn, *grid; Eina_List *l; struct group_info *gi; @@ -258,6 +352,7 @@ bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list) return false; } + ly = NULL; EINA_LIST_FOREACH(list, l, gi) { ly = _draw_list_item(lmgr, gi); if (!ly) { @@ -275,6 +370,14 @@ bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list) elm_box_pack_end(lmgr->box, ly); } + btn = elm_object_part_content_get(ly, PART_ITEM_TITLE); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT); + + grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); + elm_object_focus_next_object_set(grid, grid, ELM_FOCUS_RIGHT); + + lmgr->focused = _get_box_first_item(lmgr->box); + return true; } @@ -289,6 +392,9 @@ bool listmgr_update_play_info(struct listmgr *lmgr, app_media_info *info) if (!info) { if (lmgr->show_play_info) { + if (lmgr->play_info == lmgr->focused) + lmgr->focused = _get_box_first_item(lmgr->box); + elm_box_unpack(lmgr->box, lmgr->play_info); evas_object_hide(lmgr->play_info); lmgr->show_play_info = EINA_FALSE; @@ -330,6 +436,8 @@ bool listmgr_draw_list_area(struct listmgr *lmgr) elm_scroller_step_size_set(scr, SCROLLER_STEP_SIZE(lmgr->data->box_padding), 0); + inputmgr_add_callback(scr, LISTMGR_SCROLLER, &_handler, lmgr); + box = util_add_box(scr); if (!box) { _ERR("failed to create box object"); @@ -344,6 +452,7 @@ bool listmgr_draw_list_area(struct listmgr *lmgr) elm_object_part_content_set(lmgr->base, PART_CONTENT, scr); + lmgr->scr = scr; lmgr->box = box; if (lmgr->data->pops) { @@ -354,6 +463,9 @@ bool listmgr_draw_list_area(struct listmgr *lmgr) } } + elm_object_focus_next_object_set(lmgr->data->menu_btn, scr, + ELM_FOCUS_DOWN); + return true; } @@ -384,17 +496,32 @@ struct listmgr *listmgr_create(Evas_Object *base, void *data) lmgr->gmgr = gmgr; lmgr->data = (struct listmgr_data *)data; lmgr->show_play_info = EINA_FALSE; + lmgr->scr_focus = EINA_TRUE; return lmgr; } void listmgr_destroy(struct listmgr *lmgr) { + Eina_List *item, *l; + Evas_Object *ly, *btn, *grid; + if (!lmgr) { _ERR("invalid argument"); return; } + item = elm_box_children_get(lmgr->box); + EINA_LIST_FOREACH(item, l, ly) { + btn = elm_object_part_content_get(ly, PART_ITEM_TITLE); + grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); + + inputmgr_remove_callback(btn, &_handler); + inputmgr_remove_callback(grid, &_grid_handler); + } + + inputmgr_remove_callback(lmgr->scr, &_handler); + gridmgr_destroy(lmgr->gmgr); free(lmgr); diff --git a/src/view/base.c b/src/view/base.c index f2411d7..b726a37 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -43,23 +43,38 @@ struct _priv { struct _menu_item { const char *name; const char *layout_id; + layout_class *(*func_get_lclass)(void); }; static struct _menu_item g_menu_item[MENU_BTN_SIZE] = { { "Movie", - LAYOUT_MOVIE + LAYOUT_MOVIE, + layout_movie_get_lclass }, { "Gallery", - LAYOUT_GALLERY + LAYOUT_GALLERY, + layout_gallery_get_lclass }, { "Music", - LAYOUT_MUSIC + LAYOUT_MUSIC, + layout_music_get_lclass } }; +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (!obj || !ev) + return; + + if (!strcmp(ev->keyname, KEY_ENTER) || + !strcmp(ev->keyname, KEY_ENTER_REMOTE)) + elm_object_focus_next(obj, ELM_FOCUS_DOWN); +} + static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { @@ -102,6 +117,7 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, } static input_handler handler = { + .key_down = _key_down_cb, .mouse_move = _mouse_move_cb, .focused = _focused_cb }; @@ -160,8 +176,6 @@ static bool _draw_menu_btn(struct _priv *priv) elm_object_part_content_set(priv->base, PART_MENU_AREA, box); - elm_object_focus_set(priv->btn[0], EINA_TRUE); - elm_object_focus_next_object_set(priv->btn[MENU_BTN_SIZE - 1], priv->btn[0], ELM_FOCUS_RIGHT); elm_object_focus_next_object_set(priv->btn[0], @@ -189,6 +203,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) struct _priv *priv; Evas_Object *base; layoutmgr *lmgr; + int i; if (!win) { _ERR("failed to get win object"); @@ -210,17 +225,12 @@ static Evas_Object *_create(Evas_Object *win, void *data) elm_layout_file_set(base, EDJEFILE, GRP_BASE_VIEW); - evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); elm_win_resize_object_add(win, base); - lmgr = layoutmgr_create(base); - layoutmgr_add_layout(lmgr, layout_movie_get_lclass(), NULL); - layoutmgr_add_layout(lmgr, layout_gallery_get_lclass(), NULL); - layoutmgr_add_layout(lmgr, layout_music_get_lclass(), NULL); - priv->win = win; priv->base = base; - priv->lmgr = lmgr; if (!_draw_items(priv)) { _ERR("failed to draw items"); @@ -228,8 +238,17 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } + lmgr = layoutmgr_create(base); + for (i = 0; i < MENU_BTN_SIZE; i++) + layoutmgr_add_layout(lmgr, g_menu_item[i].func_get_lclass(), + priv->btn[i]); + + priv->lmgr = lmgr; + viewmgr_set_view_data(VIEW_BASE, priv); + elm_object_focus_set(priv->btn[0], EINA_TRUE); + return base; } -- 2.7.4 From 2e5e852a64185638b3760587a439d961f7b04f75 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 16 Jul 2015 11:39:53 +0900 Subject: [PATCH 15/16] base: add selected state for menu button Change-Id: Iff0a49345479a0eae0c8ea74c18dfc3a2cb4f51b Signed-off-by: Jehun Lim --- include/define.h | 2 + res/edc/widgets/button.edc | 135 ++++++++++++++++++++++++++++++++++++++++++--- src/util/listmgr.c | 3 + src/view/base.c | 4 ++ 4 files changed, 136 insertions(+), 8 deletions(-) diff --git a/include/define.h b/include/define.h index 73a2d81..8b0d879 100644 --- a/include/define.h +++ b/include/define.h @@ -56,6 +56,8 @@ /* signal */ #define SIG_BTN_CLICKED "btn,clicked" +#define SIG_BTN_SELECTED "btn,selected" +#define SIG_BTN_UNSELECTED "btn,unselected" #define SIG_ITEM_SELECTED "item,selected" #define SIG_SOURCE_EDC "edc" #define SIG_SOURCE_SRC "src" diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index b8d6fb1..0b66c7a 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -14,13 +14,21 @@ * limitations under the License. */ +#define STATE_NORMAL 0 +#define STATE_FOCUSED 1 +#define STATE_SELECTED 2 + #define STATE_PLAY 0 #define STATE_PAUSE 1 + #define TRANSITION_TIME 0.17 group { name: "elm/button/base/base_btn_menu"; data.item: "focus_highlight" "on"; + script { + public cur_state; + } parts { part { name: "bg"; @@ -121,23 +129,58 @@ group { } } part { + name: "padding_bottom_left"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg_left"; + relative: 0.0 1.0; + } + rel2 { + to: "bg_left"; + relative: 0.0 1.0; + } + min: 28 0; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "padding_bottom_right"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg_right"; + relative: 1.0 1.0; + } + rel2.to: "bg_right"; + min: 28 0; + align: 1.0 1.0; + fixed: 1 1; + } + } + part { name: "bottom_line"; type: RECT; scale: 1; description { state: "default" 0.0; rel1 { - to: "bg"; - relative: 0.5 1.0; + to: "padding_bottom_left"; + relative: 1.0 1.0; } rel2 { - to: "bg"; - relative: 0.5 1.0; + to: "padding_bottom_right"; + relative: 0.0 1.0; } - min: 142 3; + min: 0 3; align: 0.5 1.0; color: 0 0 0 0; - fixed: 1 1; + fixed: 0 1; } description { state: "focused" 0.0; @@ -152,27 +195,103 @@ group { } programs { program { + name: "load"; + signal: "load"; + source: ""; + script { + set_int(cur_state, STATE_NORMAL); + } + } + program { name: "focused"; signal: "elm,action,focus"; source: "elm"; + script { + set_int(cur_state, STATE_FOCUSED); + set_state(PART:"bottom_line", "focused", 0.0); + run_program(PROGRAM:"focus,anim"); + } + } + program { + name: "focus,anim"; action: STATE_SET "focused" 0.0; target: "bg"; target: "bg_left"; target: "bg_right"; target: "elm.text"; - target: "bottom_line"; transition: LINEAR TRANSITION_TIME; } program { name: "unfocused"; signal: "elm,action,unfocus"; source: "elm"; + script { + new state; + state = get_int(cur_state); + set_int(cur_state, STATE_NORMAL); + if (state == STATE_SELECTED) { + set_state(PART:"bottom_line", "selected", 0.0); + run_program(PROGRAM:"unfocus,sel,anim"); + } else { + set_state(PART:"bottom_line", "default", 0.0); + run_program(PROGRAM:"unfocus,foc,anim"); + } + } + } + program { + name: "unfocus,sel,anim"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "bg_left"; + target: "bg_right"; + target: "elm.text"; + transition: LINEAR TRANSITION_TIME; + } + program { + name: "unfocus,foc,anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "bg_left"; + target: "bg_right"; + target: "elm.text"; + transition: LINEAR TRANSITION_TIME; + } + program { + name: "selected"; + signal: SIG_BTN_SELECTED; + source: SIG_SOURCE_SRC; + script { + set_int(cur_state, STATE_SELECTED); + set_state(PART:"bottom_line", "selected", 0.0); + run_program(PROGRAM:"selected,anim"); + } + } + program { + name: "selected,anim"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "bg_left"; + target: "bg_right"; + target: "elm.text"; + transition: LINEAR TRANSITION_TIME; + } + program { + name: "unselected"; + signal: SIG_BTN_UNSELECTED; + source: SIG_SOURCE_SRC; + script { + set_int(cur_state, STATE_NORMAL); + set_state(PART:"bottom_line", "default", 0.0); + run_program(PROGRAM:"unselected,anim"); + } + } + program { + name: "unselected,anim"; action: STATE_SET "default" 0.0; target: "bg"; target: "bg_left"; target: "bg_right"; target: "elm.text"; - target: "bottom_line"; transition: LINEAR TRANSITION_TIME; } } diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 63fad7f..5a63907 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -170,6 +170,9 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, case LISTMGR_GRID: lmgr->focused = elm_object_parent_widget_get(obj); lmgr->scr_focus = EINA_TRUE; + + elm_object_signal_emit(lmgr->data->menu_btn, SIG_BTN_SELECTED, + SIG_SOURCE_SRC); break; default: break; diff --git a/src/view/base.c b/src/view/base.c index b726a37..52e0ab8 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -98,6 +98,10 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, if (priv->focused_btn == obj) return; + if (priv->focused_btn) + elm_object_signal_emit(priv->focused_btn, SIG_BTN_UNSELECTED, + SIG_SOURCE_SRC); + for (i = 0; i < MENU_BTN_SIZE; i++) { if (priv->btn[i] == obj) break; -- 2.7.4 From 4c395b73cf85aebff0774b5cec182a42bb591e82 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 16 Jul 2015 16:42:24 +0900 Subject: [PATCH 16/16] gallery: add video duration text Change-Id: I362d81d63270be520e0975ab8bd59dc9289528c8 Signed-off-by: Jehun Lim --- src/layout/gallery.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 8d396af..1a6f364 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -54,6 +54,35 @@ struct _priv { Eina_List *media_list; }; +static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) +{ + app_media *am; + app_media_info *info; + char buf[32]; + + if (!data) + return NULL; + + am = data; + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get media info"); + return NULL; + } + + if (info->media_type != MEDIA_CONTENT_TYPE_VIDEO) + return NULL; + + if (!strcmp(part, PART_ELM_TEXT_PLAYTIME)) { + util_time_string(buf, sizeof(buf), + info->video->duration, false); + + return strdup(buf); + } + + return NULL; +} + static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, const char *part) { @@ -97,6 +126,7 @@ static Evas_Object *_grid_content_get(void *data, static struct grid_class _gclass = { .item_style = STYLE_GRID_GALLERY_ITEM, + .text_get = _grid_text_get, .content_get = _grid_content_get }; -- 2.7.4