From bd1ea1c81f2d30319ae3c485b0f673a8100bb7c4 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 19 Aug 2015 17:03:13 +0900 Subject: [PATCH 01/16] action_menu: draw menu area using table object Change-Id: I16e20d5b73824ebc59d81295853c5330708e8171 Signed-off-by: Jehun Lim --- include/define.h | 4 +++- include/util/util.h | 1 + res/edc/widgets/button.edc | 14 +++++++------- src/util/util.c | 18 ++++++++++++++++++ src/view/action_menu.c | 47 +++++++++++++++++++++++++--------------------- 5 files changed, 55 insertions(+), 29 deletions(-) diff --git a/include/define.h b/include/define.h index c8861f3..c626565 100644 --- a/include/define.h +++ b/include/define.h @@ -74,7 +74,9 @@ #define SIG_ITEM_FOCUSED "item,focused" #define SIG_ITEM_SELECTED "item,selected" #define SIG_ITEM_UNSELECTED "item,unselected" -#define SIG_ITEM_DISABLED "item,disabled" +#define SIG_ELM_DISABLED "elm,state,disabled" +#define SIG_ELM_FOCUS "elm,action,focus" +#define SIG_ELM_UNFOCUS "elm,action,unfocus" #define SIG_ELM_UNFOCUSED "elm,state,unfocused" #define SIG_SOURCE_EDC "edc" #define SIG_SOURCE_ELM "elm" diff --git a/include/util/util.h b/include/util/util.h index b2e6175..0bca6a0 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -27,6 +27,7 @@ Evas_Object *util_add_gengrid(Evas_Object *base, int item_size_x, Evas_Object *util_add_genlist(Evas_Object *base); Evas_Object *util_add_image(Evas_Object *base, const char *file); Evas_Object *util_add_scroller(Evas_Object *base); +Evas_Object *util_add_table(Evas_Object *base, int padding_x, int padding_y); void util_time_string(char *str, int size, unsigned int ms, bool full); void util_up_string(char *str); diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index d2b0140..c6734a4 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -3252,8 +3252,8 @@ group { } program { name: "go_active"; - signal: "elm,action,focus"; - source: "elm"; + signal: SIG_ELM_FOCUS; + source: SIG_SOURCE_ELM; action: STATE_SET "focused" 0.0; target: "bg"; target: "menu_icon"; @@ -3262,8 +3262,8 @@ group { } program { name: "go_passive"; - signal: "elm,action,unfocus"; - source: "elm"; + signal: SIG_ELM_UNFOCUS; + source: SIG_SOURCE_ELM; action: STATE_SET "default" 0.0; target: "bg"; target: "menu_icon"; @@ -3280,9 +3280,9 @@ group { target: "elm.text"; } program { - name: SIG_ITEM_DISABLED; - signal: SIG_ITEM_DISABLED; - source: SIG_SOURCE_SRC; + name: SIG_ELM_DISABLED; + signal: SIG_ELM_DISABLED; + source: SIG_SOURCE_ELM; action: STATE_SET "disabled" 0.0; target: "bg"; target: "menu_icon"; diff --git a/src/util/util.c b/src/util/util.c index ec55187..5dc631b 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -147,6 +147,24 @@ Evas_Object *util_add_scroller(Evas_Object *base) return scr; } +Evas_Object *util_add_table(Evas_Object *base, int padding_x, int padding_y) +{ + Evas_Object *table; + + if (!base) + return NULL; + + table = elm_table_add(base); + if (!table) { + _ERR("failed to create table object"); + return NULL; + } + + elm_table_padding_set(table, padding_x, padding_y); + + return table; +} + void util_time_string(char *str, int size, unsigned int ms, bool full) { int sec; diff --git a/src/view/action_menu.c b/src/view/action_menu.c index 552ea19..f4b65b9 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -29,7 +29,11 @@ #define VIDEO_COPYRIGHT "Unknown" -#define MAX_NUM_MENU 4 +#define NUM_MENU_BTN 4 +#define MAX_BTN_COL 4 + +#define TABLE_PADDING_X 0 +#define TABLE_PADDING_Y 0 enum _object_type { ACTION_LIVETV_BTN = 0, @@ -49,7 +53,7 @@ struct _priv { Evas_Object *base; Evas_Object *tv_btn; - Evas_Object *menu_btn[MAX_NUM_MENU]; + Evas_Object *menu_btn[NUM_MENU_BTN]; Evas_Object *grid; Eina_List *favorite_list; @@ -391,33 +395,29 @@ static bool _draw_livetv_btn(struct _priv *priv) static bool _draw_menu_area(struct _priv *priv) { - Evas_Object *box, *btn; + Evas_Object *table, *btn; int i; + int col, row; - box = util_add_box(priv->base); - if (!box) { - _ERR("failed to create box object"); + table = util_add_table(priv->base, TABLE_PADDING_X, TABLE_PADDING_Y); + if (!table) { + _ERR("failed to add table"); return false; } - for (i = 0; i < MAX_NUM_MENU; i++) { - btn = elm_button_add(box); + for (i = 0; i < NUM_MENU_BTN; i++) { + btn = elm_button_add(priv->base); if (!btn) { _ERR("failed to create button object"); - evas_object_del(box); + evas_object_del(table); return false; } elm_object_style_set(btn, menu_info[i].style); elm_object_text_set(btn, menu_info[i].title); - if (menu_info[i].disabled) { - elm_object_signal_emit(btn, SIG_ITEM_DISABLED, - SIG_SOURCE_SRC); - elm_object_focus_allow_set(btn, EINA_FALSE); - } - - elm_box_pack_end(box, btn); + if (menu_info[i].disabled) + elm_object_disabled_set(btn, EINA_TRUE); evas_object_show(btn); @@ -426,18 +426,23 @@ static bool _draw_menu_area(struct _priv *priv) elm_object_focus_next_object_set(btn, priv->grid, ELM_FOCUS_DOWN); + col = i % MAX_BTN_COL; + row = i / MAX_BTN_COL; + + elm_table_pack(table, btn, col, row, 1, 1); + priv->menu_btn[i] = btn; } - evas_object_show(box); + evas_object_show(table); elm_object_focus_next_object_set(priv->menu_btn[0], priv->menu_btn[0], ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(priv->menu_btn[MAX_NUM_MENU - 1], - priv->menu_btn[MAX_NUM_MENU - 1], + elm_object_focus_next_object_set(priv->menu_btn[NUM_MENU_BTN - 1], + priv->menu_btn[NUM_MENU_BTN - 1], ELM_FOCUS_RIGHT); - elm_object_part_content_set(priv->base, PART_ACTION_MENU_AREA, box); + elm_object_part_content_set(priv->base, PART_ACTION_MENU_AREA, table); return true; } @@ -655,7 +660,7 @@ static void _destroy(void *view_data) inputmgr_remove_callback(priv->tv_btn, &_handler); inputmgr_remove_callback(priv->grid, &_handler); - for (i = 0; i < MAX_NUM_MENU; i++) + for (i = 0; i < NUM_MENU_BTN; i++) inputmgr_remove_callback(priv->menu_btn[i], &_handler); if (priv->favorite_list) -- 2.7.4 From 28017be78c1dee4d01b763e0243e908fae317d07 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 19 Aug 2015 18:18:43 +0900 Subject: [PATCH 02/16] action_menu: use viewmgr_hide_view() instead of viewmgr_pop_view() Change-Id: I3c544481484814f2bea480b6e00587849d195db3 Signed-off-by: Jehun Lim --- src/view/action_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view/action_menu.c b/src/view/action_menu.c index f4b65b9..7dec094 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -125,7 +125,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) - viewmgr_pop_view(); + viewmgr_hide_view(VIEW_ACTION_MENU); } static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, -- 2.7.4 From 70875af707430879dee58a611590c2ba74bf1acf Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 20 Aug 2015 13:19:52 +0900 Subject: [PATCH 03/16] mplayer: adds support shuffling the list Change-Id: I6d301b24b8360903ceaed56d2cbb7dc40b575dd3 Signed-off-by: Minkyu Kang --- res/edc/widgets/genlist.edc | 1 + src/view/mplayer.c | 128 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 100 insertions(+), 29 deletions(-) diff --git a/res/edc/widgets/genlist.edc b/res/edc/widgets/genlist.edc index 8ac6183..72b611e 100644 --- a/res/edc/widgets/genlist.edc +++ b/res/edc/widgets/genlist.edc @@ -276,6 +276,7 @@ group { ellipsis: -1; } visible: 0; + fixed: 1 1; } description { state: "default" 0.1; diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 324cda0..692346b 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -45,7 +45,9 @@ struct _list_data { struct _playlist { Eina_List *list; + Eina_List *list_org; int cur; + bool shuffle; }; struct _priv { @@ -156,7 +158,20 @@ static void _draw_progressbar(struct _priv *priv, app_media_info *mi) progressbar_show(priv->progress); } -static app_media_info *_get_current_media_info(struct _priv *priv) +static app_media *_playlist_get_media(Eina_List *list, int index) +{ + app_media *am; + + am = eina_list_nth(list, index); + if (!am) { + _ERR("failed to get app_media"); + return NULL; + } + + return am; +} + +static app_media_info *_playlist_get_current_media_info(struct _priv *priv) { app_media *am; app_media_info *mi; @@ -176,6 +191,38 @@ static app_media_info *_get_current_media_info(struct _priv *priv) return mi; } +static int _playlist_get_index(Eina_List *dest, Eina_List *src, int index) +{ + app_media *am; + + am = _playlist_get_media(src, index); + + return util_get_media_index(dest, am); +} + +static void _playlist_set_list(struct _priv *priv, bool shuffle, int index) +{ + struct _playlist *p; + app_media *am; + + p = &priv->playlist; + if (!p) { + _ERR("playlist is NULL"); + return; + } + + am = _playlist_get_media(p->list, index); + eina_list_free(p->list); + + p->list = eina_list_clone(p->list_org); + + if (shuffle) + p->list = eina_list_shuffle(p->list, NULL); + + p->cur = util_get_media_index(p->list, am); + p->shuffle = shuffle; +} + static void _update_info(struct _priv *priv, app_media_info *mi) { struct view_update_data vdata; @@ -184,7 +231,8 @@ static void _update_info(struct _priv *priv, app_media_info *mi) progressbar_reset(priv->progress, 0, mi->audio->duration); /* update play info */ - vdata.index = priv->playlist.cur; + vdata.index = _playlist_get_index(priv->playlist.list_org, + priv->playlist.list, priv->playlist.cur); viewmgr_update_view(VIEW_BASE, UPDATE_PLAY_INFO, &vdata); /* update history */ @@ -196,7 +244,7 @@ static void _mplayer_show(struct _priv *priv) struct controller *ctl; app_media_info *mi; - mi = _get_current_media_info(priv); + mi = _playlist_get_current_media_info(priv); if (!mi) { _ERR("failed to getting media info"); return; @@ -301,7 +349,7 @@ static void _player_play_pause(struct _priv *priv) break; case PLAYER_STATE_IDLE: case PLAYER_STATE_READY: - mi = _get_current_media_info(priv); + mi = _playlist_get_current_media_info(priv); if (!mi) { _ERR("failed to getting media info"); return; @@ -331,7 +379,7 @@ static void _player_next(struct _priv *priv) playermgr_stop(priv->player); break; case PLAYER_STATE_PLAYING: - mi = _get_current_media_info(priv); + mi = _playlist_get_current_media_info(priv); if (!mi) { _ERR("failed to getting media info"); return; @@ -353,7 +401,7 @@ static void _player_play(struct _priv *priv) const char *path; struct controller *ctl; - mi = _get_current_media_info(priv); + mi = _playlist_get_current_media_info(priv); if (!mi) { _ERR("failed to getting media info"); return; @@ -421,32 +469,14 @@ static struct progressbar_ops _progressbar_ops = { .get_value = _player_get_position, }; -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); - _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)) { - _player_play_pause(priv); - } -} - static void _pop_view(struct _priv *priv) { struct view_update_data vdata; if (viewmgr_active_view_count() > 1) { - vdata.index = priv->playlist.cur; + vdata.index = _playlist_get_index(priv->playlist.list_org, + priv->playlist.list, priv->playlist.cur); + viewmgr_update_view(VIEW_BASE, UPDATE_FOCUS, &vdata); } @@ -686,6 +716,33 @@ static void _add_playlist_item(struct _priv *priv) } } +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); + _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)) { + _player_play_pause(priv); + } else if (!strcmp(ev, SRC_BTN_MUSIC_SHUFFLE)) { + _playlist_set_list(priv, !priv->playlist.shuffle, + priv->playlist.cur); + _add_playlist_item(priv); + + _mplayer_set_current(priv, priv->playlist.cur); + _player_play(priv); + } +} + static bool _ui_init(struct _priv *priv) { struct controller *ctl; @@ -783,7 +840,9 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->base = base; priv->playlist.list = NULL; + priv->playlist.list_org = NULL; priv->playlist.cur = 0; + priv->playlist.shuffle = false; player = playermgr_create(NULL); if (!player) { @@ -873,8 +932,17 @@ static void _update(void *view_data, int update_type, void *data) if (!vdata) break; - priv->playlist.list = vdata->list; - priv->playlist.cur = vdata->index; + if (priv->playlist.list_org != vdata->list) { + priv->playlist.list_org = vdata->list; + priv->playlist.list = eina_list_clone(vdata->list); + + _playlist_set_list(priv, + priv->playlist.shuffle, vdata->index); + } else { + priv->playlist.cur = _playlist_get_index( + priv->playlist.list, + vdata->list, vdata->index); + } _add_playlist_item(priv); break; @@ -922,6 +990,8 @@ static void _destroy(void *view_data) inputmgr_remove_callback(obj, &_btn_handler); } + eina_list_free(priv->playlist.list); + _list_free(priv); inputmgr_remove_callback(priv->list, &_list_handler); -- 2.7.4 From 6c754eac11174331a8a01d8409e45e94a35d5177 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 20 Aug 2015 15:14:43 +0900 Subject: [PATCH 04/16] mplayer: add repeat button Change-Id: I7aa9b2f9b98f4a0a0626daecfc2d54396fe6a8c4 Signed-off-by: Minkyu Kang --- include/view/mplayer.h | 4 + res/edc/images/btn_music_contr_one_mode_nor.png | Bin 1175 -> 2113 bytes res/edc/images/btn_music_contr_one_mode_sel.png | Bin 0 -> 2052 bytes res/edc/images/btn_music_contr_repeat_dis.png | Bin 0 -> 2041 bytes res/edc/images/btn_music_contr_repeat_dis_foc.png | Bin 0 -> 1979 bytes res/edc/images/btn_music_contr_repeat_foc.png | Bin 1058 -> 3866 bytes res/edc/images/btn_music_contr_repeat_nor.png | Bin 1110 -> 3896 bytes res/edc/widgets/button.edc | 292 ++++++++++++++++++++++ src/view/mplayer.c | 4 + 9 files changed, 300 insertions(+) create mode 100644 res/edc/images/btn_music_contr_one_mode_sel.png create mode 100644 res/edc/images/btn_music_contr_repeat_dis.png create mode 100644 res/edc/images/btn_music_contr_repeat_dis_foc.png diff --git a/include/view/mplayer.h b/include/view/mplayer.h index eab576b..b7a697a 100644 --- a/include/view/mplayer.h +++ b/include/view/mplayer.h @@ -62,6 +62,10 @@ #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" +#define IMAGE_MUSIC_REPEAT_DIS_FOCUS "btn_music_contr_repeat_dis_foc.png" +#define IMAGE_MUSIC_REPEAT_DIS_NORMAL "btn_music_contr_repeat_dis.png" +#define IMAGE_MUSIC_REPEAT_ONE_FOCUS "btn_music_contr_one_mode_sel.png" +#define IMAGE_MUSIC_REPEAT_ONE_NORMAL "btn_music_contr_one_mode_nor.png" #define IMAGE_MUSIC_LIST_PLAY "ic_mini_player_play_nor.png" #define IMAGE_MUSIC_LIST_PLAY_FOC "ic_mini_player_play_foc.png" diff --git a/res/edc/images/btn_music_contr_one_mode_nor.png b/res/edc/images/btn_music_contr_one_mode_nor.png index 1342b25a45850388c803db211502003f7d97a4e7..9b409ac8ed2f82dff28680a2267bd56a34af4b1d 100644 GIT binary patch literal 2113 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 diff --git a/res/edc/images/btn_music_contr_one_mode_sel.png b/res/edc/images/btn_music_contr_one_mode_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..20c21ba66bc2364924e82c238ddf5f0e4d315d19 GIT binary patch literal 2052 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 AVE_OC 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 index e01d911f54b25e830736a12fe282c79f14e7b754..41acbe58d3c5b64928a53fb968d075327216baad 100644 GIT binary patch literal 3866 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 literal 1058 zcmeAS@N?(olHy`uVBq!ia0vp^OMtkKg9S*6c4yCGU|@df>EaktaqI0J|BfrAGRHoq z|KIYaEkvnPR9lcWGH@C@_u@0&i3zez3QaA1Nz++6^MpdKsJ@W8qPpei38G>y7=Z9glB~d>`KbF@JBF($c`atHVuVY>(CKEmunS zc~Mv!WqT&Z*J>j3uK4v?G4?O_L_Ema=_;RH{q;aGZy3LU_3<#<#TWVJ6?(O=ZvV$V zt6*&sQ^R7L^R;Uh)E~5t{m4pwBYCzldQ*O72&?RmS&Dy+3d|_x^u1?`O6}oXH3JWA@H) z<||^karapNm)3QR-x%MQ?)36+ui^SJ&3kv;b1y%pew}L*{>m`V+feJxr+aOJbc4SB zht+=S*9FuYua@p!S(Cas@KT;{^tE5X$&<{k<}NdOGIx^QhPB`NmXwyxUddCrcggwO z)v^;yitnar-T(X3`LNVQ$;(;JR;!DpR^9S>+UXKBKX+^9>nz#TJe6LTLbqL=<~eK4 zZJ*Q=oSv(5SKrlmxq8>xkT#j=TkdVU#T@k1ddgJA?;cel%FC|GP1>?P&v>e${bfbn z>td&)q_=q4XVgE;(~6(}N#O(c^^(2k80Isa4|})NY)OT*#esn7tM@R}+#EKw50VYKbL{*93-dFTIkNX1qR+oeXTN;l+N;`-bdg7D zeT=*R{mYv0+=4x~HRiPA1D)BYzhCH>kffQvK}d1k(+6+n$B6Iy&vk7>FF&Kj!M#sE zo2#X~uIh<@c_cIL$)-;$TQkn6>!!`g|D1d8@~^n|t?|`gqraZe_5Cey)$8r0yK8T* zYJcf6+0I4P^M2;uvW!(#J?Bi{x}4kLZCx7cm-5~2(%V~+wl3+jDwV1OjQvyiy*wtj fn0O8l@soS1Oz5wM=Lh})^FD*8tDnm{r-UW|#;oMV diff --git a/res/edc/images/btn_music_contr_repeat_nor.png b/res/edc/images/btn_music_contr_repeat_nor.png index d638a751e8ba02950822ce3794375d4371e37451..00092ce3991cdef990cead22529dabde8b9b4840 100644 GIT binary patch literal 3896 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 QttP-o&s?`c$K~OF0LO$YDF6Tf literal 1110 zcmeAS@N?(olHy`uVBq!ia0vp^OMtkKg9S*6c4yCGU|^B;ba4!+xb^mqcgB@)iMEgG zei|G{S8_CYh2*dVb8wW_gcQH1Lq4aEx%CJ)>S5=Ew5Dofo{y4a0H z*JH8X7Kx)<9=RP|bg8RXd{M{tl$Z>kITC;QKc6yR`943)_>9cC?*)@~wu+=0v@%|l z{;|KnL$F<>a3BfIzIzVaH>s50I;!=qBtEzE-WTt`Z(a13Og;6&caLA-o&SG5OPDsN zHu#wZpLYJxd8Yh)w#C^aFLG1zR~0OoaWu`Za5A4!ZOpEkWAbZy?-lsBeo6^Gw4+)P&yNZ6l2UtXHF|_CXU8tt z>0-+6@#)U@4ykQ>cBJc`p6M)_zNo#!eqyM}#Ao7OH|J|Sc3pPy!>4(-Gtw;FHT&h1 zt)8%an~y^7Ly*2l5Qn(oT#=Fb;%p;BX zNtN;QbEXBK3Z3?3s-V@6KC^ufW}gUDa^_ngwc@ekJ?+28trn;iOuH~awC9`;h)>;K^LjzlHrWsT9B zuI4#BnSJ!c1j!d4-&w}by>zumOmY*igj#eiM}c|Xj1v={JN{@&l_{_Uv6nY+-OP#? z{&m(lhNq-osuzP2jG=6{h&-i#aky003o+@9?9>+*GA_J8Eo z$y?dM%(HAF|EHMc^G?PrR4khEg1;=hU@q6UZ@+wJrj$wh#Shj(vY*(B zcbv7UOV8<#UViyhQ_Ju5kJY;(&VIb%xX9T_+xX|~qHFti#GR>{B{}uQ#;0=@%v0A% zto|a=`a$;*>#_}jQtcg_y0=mvXb4VjJf=TIv+`ugzJq z_jlWl@F$JxM%6EjUU>X4%(uRt`H;i+PXF!ytC{>$wiz`{e3RmK{a#W0 Date: Thu, 20 Aug 2015 16:11:15 +0900 Subject: [PATCH 05/16] action_menu: add selected callback for favorite item Change-Id: Ie4139cb1d150cab130228e9f271094c12aa655ed Signed-off-by: Jehun Lim --- src/view/action_menu.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/src/view/action_menu.c b/src/view/action_menu.c index 7dec094..b2241fd 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -54,9 +54,13 @@ struct _priv { Evas_Object *tv_btn; Evas_Object *menu_btn[NUM_MENU_BTN]; + Evas_Object *grid; + Elm_Object_Item *selected_it; Eina_List *favorite_list; + + int content_type; }; struct _menu_info { @@ -157,9 +161,70 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, } } +static void _grid_selected(void *data) +{ + app_media *am; + struct view_update_data vdata; + struct _priv *priv; + + if (!data) { + _ERR("invalid argument"); + return; + } + + priv = data; + + am = elm_object_item_data_get(priv->selected_it); + if (!am) { + _ERR("failed to get app media"); + return; + } + + vdata.list = priv->favorite_list; + vdata.index = util_get_media_index(vdata.list, am); + + viewmgr_hide_view(VIEW_ACTION_MENU); + + switch (priv->content_type) { + case E_CONTENT_MOVIE: + case E_CONTENT_GALLERY: + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_VIEWER); + break; + case E_CONTENT_MUSIC: + viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_MPLAYER); + break; + default: + break; + } +} + +static void _selected_cb(int id, void *data, Evas_Object *obj, + Elm_Object_Item *it) +{ + struct _priv *priv; + + if (!data || !it) + return; + + priv = data; + + switch (id) { + case ACTION_FAVORITE_GRID: + priv->selected_it = it; + ecore_job_add(_grid_selected, priv); + + break; + default: + break; + } +} + static input_handler _handler = { .key_down = _key_down_cb, - .mouse_move = _mouse_move_cb + .mouse_move = _mouse_move_cb, + .selected = _selected_cb }; static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) @@ -473,16 +538,19 @@ static bool _draw_favorite_area(struct _priv *priv) return true; } -static void _update_favorite_area(struct _priv *priv, int type) +static void _update_favorite_area(struct _priv *priv) { Elm_Gengrid_Item_Class *ic; Elm_Object_Item *it; Eina_List *favorite_l, *l; app_media *am; + int type; elm_gengrid_clear(priv->grid); + type = priv->content_type; + elm_gengrid_item_size_set(priv->grid, elm_config_scale_get() * content_info[type].grid_x, elm_config_scale_get() * content_info[type].grid_y); @@ -526,7 +594,6 @@ static bool _update_items(struct _priv *priv, struct view_update_data *vdata) { app_media *am; app_media_info *mi; - int type; am = eina_list_nth(vdata->list, vdata->index); if (!am) { @@ -540,9 +607,9 @@ static bool _update_items(struct _priv *priv, struct view_update_data *vdata) return false; } - type = _get_content_type(mi); + priv->content_type = _get_content_type(mi); - _update_favorite_area(priv, type); + _update_favorite_area(priv); return true; } -- 2.7.4 From 0c802141d6f83606e0581ee33ae2ef0128ff0270 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 20 Aug 2015 16:28:10 +0900 Subject: [PATCH 06/16] mplayer: adds support three state of repeat mode (all/one/none) Change-Id: I5eee61ce78a29ae2b20db3e4b324579c4e113300 Signed-off-by: Minkyu Kang --- src/view/mplayer.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 96 insertions(+), 14 deletions(-) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 8c3b881..c1cafd0 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -38,6 +38,12 @@ #define PART_MUSIC_BTN "control_btn" #define PLAY_BTN_LOC 2 +enum _repeat_state { + REPEAT_ALL, + REPEAT_ONE, + REPEAT_NONE +}; + struct _list_data { app_media *am; Elm_Object_Item *item; @@ -48,6 +54,7 @@ struct _playlist { Eina_List *list_org; int cur; bool shuffle; + enum _repeat_state repeat; }; struct _priv { @@ -227,6 +234,33 @@ static void _playlist_set_list(struct _priv *priv, bool shuffle, int index) p->shuffle = shuffle; } +static void _playlist_set_repeat_mode(struct _priv *priv) +{ + struct _playlist *p; + + p = &priv->playlist; + if (!p) { + _ERR("playlist is NULL"); + return; + } + + switch (p->repeat) { + case REPEAT_ALL: + p->repeat = REPEAT_ONE; + break; + case REPEAT_ONE: + p->repeat = REPEAT_NONE; + break; + case REPEAT_NONE: + p->repeat = REPEAT_ALL; + break; + default: + _ERR("Unknown repeat state"); + p->repeat = REPEAT_ALL; + break; + } +} + static void _update_info(struct _priv *priv, app_media_info *mi) { struct view_update_data vdata; @@ -278,32 +312,69 @@ static void _mplayer_hide(struct _priv *priv) ctl->ops->hide(ctl->handle); } -static void _mplayer_prev(struct _priv *priv) +static bool _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--; + switch (priv->playlist.repeat) { + case REPEAT_ALL: + if (priv->playlist.cur != 0) + priv->playlist.cur--; + else + priv->playlist.cur = total - 1; + break; + case REPEAT_NONE: + if (priv->playlist.cur != 0) + priv->playlist.cur--; + break; + case REPEAT_ONE: + break; + default: + _ERR("Unknown repeat state"); + break; + } _mplayer_show(priv); + + return true; } -static void _mplayer_next(struct _priv *priv) +static bool _mplayer_next(struct _priv *priv) { int total; + bool r; total = eina_list_count(priv->playlist.list); - if (priv->playlist.cur == total - 1) - priv->playlist.cur = 0; - else - priv->playlist.cur++; + r = true; + + switch (priv->playlist.repeat) { + case REPEAT_ALL: + if (priv->playlist.cur != total - 1) + priv->playlist.cur++; + else + priv->playlist.cur = 0; + break; + case REPEAT_NONE: + if (priv->playlist.cur != total - 1) + priv->playlist.cur++; + else { + priv->playlist.cur = 0; + r = false; + } + break; + case REPEAT_ONE: + break; + default: + _ERR("Unknown repeat state"); + break; + } _mplayer_show(priv); + + return r; } static void _mplayer_set_current(struct _priv *priv, int index) @@ -459,14 +530,18 @@ static void _player_stop(struct _priv *priv) static void _player_complete_cb(void *data) { struct _priv *priv; + bool r; if (!data) return; priv = data; - _mplayer_next(priv); - _player_next(priv); + r = _mplayer_next(priv); + if (r) + _player_next(priv); + else + _player_stop(priv); } static struct progressbar_ops _progressbar_ops = { @@ -723,6 +798,7 @@ static void _add_playlist_item(struct _priv *priv) static void _callback_music(void *data, const char *ev) { struct _priv *priv; + bool r; if (!data || !ev) return; @@ -733,8 +809,11 @@ static void _callback_music(void *data, const char *ev) _mplayer_prev(priv); _player_next(priv); } else if (!strcmp(ev, SRC_BTN_MUSIC_NEXT)) { - _mplayer_next(priv); - _player_next(priv); + r = _mplayer_next(priv); + if (r) + _player_next(priv); + else + _player_stop(priv); } else if (!strcmp(ev, SRC_BTN_MUSIC_PLAY)) { _player_play_pause(priv); } else if (!strcmp(ev, SRC_BTN_MUSIC_SHUFFLE)) { @@ -744,6 +823,8 @@ static void _callback_music(void *data, const char *ev) _mplayer_set_current(priv, priv->playlist.cur); _player_play(priv); + } else if (!strcmp(ev, SRC_BTN_MUSIC_REPEAT)) { + _playlist_set_repeat_mode(priv); } } @@ -847,6 +928,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->playlist.list_org = NULL; priv->playlist.cur = 0; priv->playlist.shuffle = false; + priv->playlist.repeat = REPEAT_ALL; player = playermgr_create(NULL); if (!player) { -- 2.7.4 From fddb959eaf0a6e1d4235b874c68c5da0e6018fa6 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 21 Aug 2015 17:27:48 +0900 Subject: [PATCH 07/16] button: set different state as focusing Change-Id: Ie6ef359ccfec704f95c3ac89ca01ff8fb4014ead Signed-off-by: Minkyu Kang --- res/edc/widgets/button.edc | 62 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index e8a039b..3973cc9 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -714,6 +714,7 @@ group { } script { public cur_state; + public focused; } parts { part { @@ -798,9 +799,18 @@ group { signal: SIG_SET_PLAY; source: ""; script { + new state; + state = get_int(focused); + + if (state == STATE_NORMAL) { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"color", "default", 0.0); + } else { + set_state(PART:"bg", "selected", 0.0); + set_state(PART:"color", "selected", 0.0); + } + set_int(cur_state, STATE_PLAY); - set_state(PART:"bg", "default", 0.0); - set_state(PART:"color", "default", 0.0); } } program { @@ -808,9 +818,18 @@ group { signal: SIG_SET_PAUSE; source: ""; script { + new state; + state = get_int(focused); + + if (state == STATE_NORMAL) { + set_state(PART:"bg", "default_pause", 0.0); + set_state(PART:"color", "default_pause", 0.0); + } else { + set_state(PART:"bg", "selected_pause", 0.0); + set_state(PART:"color", "selected_pause", 0.0); + } + set_int(cur_state, STATE_PAUSE); - set_state(PART:"bg", "default_pause", 0.0); - set_state(PART:"color", "default_pause", 0.0); } } program { @@ -892,6 +911,8 @@ group { run_program(PROGRAM:"focused,play"); else run_program(PROGRAM:"focused,pause"); + + set_int(focused, STATE_FOCUSED); } } program { @@ -906,6 +927,8 @@ group { run_program(PROGRAM:"unfocused,play"); else run_program(PROGRAM:"unfocused,pause"); + + set_int(focused, STATE_NORMAL); } } program { @@ -1270,6 +1293,7 @@ group { } script { public cur_state; + public focused; } parts { part { @@ -1355,9 +1379,18 @@ group { signal: SIG_SET_PLAY; source: ""; script { + new state; + state = get_int(focused); + + if (state == STATE_NORMAL) { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"color", "default", 0.0); + } else { + set_state(PART:"bg", "selected", 0.0); + set_state(PART:"color", "selected", 0.0); + } + set_int(cur_state, STATE_PLAY); - set_state(PART:"bg", "default", 0.0); - set_state(PART:"color", "default", 0.0); } } program { @@ -1365,9 +1398,18 @@ group { signal: SIG_SET_PAUSE; source: ""; script { + new state; + state = get_int(focused); + + if (state == STATE_NORMAL) { + set_state(PART:"bg", "default_pause", 0.0); + set_state(PART:"color", "default_pause", 0.0); + } else { + set_state(PART:"bg", "selected_pause", 0.0); + set_state(PART:"color", "selected_pause", 0.0); + } + set_int(cur_state, STATE_PAUSE); - set_state(PART:"bg", "default_pause", 0.0); - set_state(PART:"color", "default_pause", 0.0); } } program { @@ -1449,6 +1491,8 @@ group { run_program(PROGRAM:"focused,play"); else run_program(PROGRAM:"focused,pause"); + + set_int(focused, STATE_FOCUSED); } } program { @@ -1463,6 +1507,8 @@ group { run_program(PROGRAM:"unfocused,play"); else run_program(PROGRAM:"unfocused,pause"); + + set_int(focused, STATE_NORMAL); } } program { -- 2.7.4 From f72cb4d065fde2439e4c3570a3edb4960c79b6b0 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 21 Aug 2015 17:33:44 +0900 Subject: [PATCH 08/16] mplayer: adds support the remote controller Change-Id: Ie03a18c1fb1f59f5f414491cbfe4ad9ff17faae7 Signed-off-by: Minkyu Kang --- src/view/mplayer.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index c1cafd0..5109d7c 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -469,6 +469,31 @@ static void _player_next(struct _priv *priv) } } +static void _player_pause(struct _priv *priv) +{ + player_state_e state; + struct controller *ctl; + + playermgr_get_state(priv->player, &state); + + switch (state) { + case PLAYER_STATE_PLAYING: + progressbar_pause(priv->progress); + playermgr_pause(priv->player); + break; + case PLAYER_STATE_PAUSED: + case PLAYER_STATE_IDLE: + case PLAYER_STATE_READY: + break; + default: + _ERR("player was not created"); + break; + } + + ctl = priv->ctl; + ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); +} + static void _player_play(struct _priv *priv) { app_media_info *mi; @@ -569,6 +594,7 @@ static void _key_down(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { struct _priv *priv; + bool r; if (!data || !ev) return; @@ -576,8 +602,24 @@ static void _key_down(int id, void *data, Evas *e, Evas_Object *obj, priv = data; if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { _pop_view(priv); + } else if (!strcmp(ev->keyname, KEY_PLAY)) { + _player_play(priv); + } else if (!strcmp(ev->keyname, KEY_PAUSE)) { + _player_pause(priv); + } else if (!strcmp(ev->keyname, KEY_STOP)) { + _player_stop(priv); + } else if (!strcmp(ev->keyname, KEY_NEXT)) { + r = _mplayer_next(priv); + if (r) + _player_next(priv); + else + _player_stop(priv); + } else if (!strcmp(ev->keyname, KEY_PREVIOUS)) { + _mplayer_prev(priv); + _player_next(priv); + } } static void _list_set_focus(struct _priv *priv) -- 2.7.4 From 3b1cd793924a0b897322938e5c76ce69a955dfdc Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 24 Aug 2015 10:55:48 +0900 Subject: [PATCH 09/16] fix media query correctly Change-Id: I60c202152b6bf85c042aaf0916f48dd8a00ccb01 Signed-off-by: Minkyu Kang --- src/layout/gallery.c | 7 +------ src/layout/movie.c | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 902c16c..d701a2c 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -29,12 +29,7 @@ #include "util/listmgr.h" #include "util/util.h" -/* - FIXME -#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 LIST_MEDIA_COND "media_type=0 OR (media_type=1 AND copyright=\"Unknown\")" #define TEXT_NOCONTENT "No Photo & Video" diff --git a/src/layout/movie.c b/src/layout/movie.c index b615b83..59589f8 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -31,7 +31,7 @@ #include "util/progressbar.h" #include "util/util.h" -#define LIST_MEDIA_COND "media_type=1 AND copyright NOT LIKE \"Unknown\"" +#define LIST_MEDIA_COND "media_type=1 AND copyright!=\"Unknown\"" #define TEXT_NOCONTENT "No Movies" #define TEXT_RECENTLY_WATCHED "Recently watched" -- 2.7.4 From 19cfec4095298b7393dcd16e2b89e89bec60e31b Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 24 Aug 2015 11:31:46 +0900 Subject: [PATCH 10/16] listmgr: fix checkpatch issue Change-Id: I5dbbd1f90c681973e7b8d2acd0b7d0a45a1193d6 Signed-off-by: Minkyu Kang --- src/util/listmgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/listmgr.c b/src/util/listmgr.c index c2a1831..65af1d6 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -267,7 +267,7 @@ static void _realized_cb(int id, void *data, Evas_Object *obj, lmgr = data; elm_object_item_signal_callback_add(it, SIG_ITEM_FOCUSED, - SIG_SOURCE_EDC,_item_focused_cb, lmgr); + SIG_SOURCE_EDC, _item_focused_cb, lmgr); } static void _unrealized_cb(int id, void *data, Evas_Object *obj, -- 2.7.4 From fe751c4e9afd894f9a2e56ee4ee61f81b0800119 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 21 Aug 2015 13:12:54 +0900 Subject: [PATCH 11/16] action_menu: add clicked callback for favorite menu button Change-Id: Iaa315b6fa6ec9e13691a59f14d275d2b50ed1dc6 Signed-off-by: Jehun Lim --- include/define.h | 1 + res/edc/widgets/button.edc | 128 +++++++++++++++++++++++++++++- src/view/action_menu.c | 190 +++++++++++++++++++++++++++++++++------------ 3 files changed, 266 insertions(+), 53 deletions(-) diff --git a/include/define.h b/include/define.h index c626565..0d68bd9 100644 --- a/include/define.h +++ b/include/define.h @@ -74,6 +74,7 @@ #define SIG_ITEM_FOCUSED "item,focused" #define SIG_ITEM_SELECTED "item,selected" #define SIG_ITEM_UNSELECTED "item,unselected" +#define SIG_ITEM_TOGGLED "item,toggled" #define SIG_ELM_DISABLED "elm,state,disabled" #define SIG_ELM_FOCUS "elm,action,focus" #define SIG_ELM_UNFOCUS "elm,action,unfocus" diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 3973cc9..a854c6b 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -18,6 +18,7 @@ #define STATE_FOCUSED 1 #define STATE_SELECTED 2 #define STATE_DISABLED 3 +#define STATE_TOGGLED 4 #define STATE_SHOW 0 #define STATE_HIDE 1 @@ -3417,6 +3418,14 @@ group { color: COLOR_ITEM_FOCUS; } description { + state: "default_toggle" 0.0; + inherit: "default" 0.0; + } + description { + state: "focused_toggle" 0.0; + inherit: "focused" 0.0; + } + description { state: "selected" 0.0; inherit: "default" 0.0; } @@ -3515,6 +3524,16 @@ group { image.normal: IMAGE_ACTION_FAVORITE_FOC; } description { + state: "default_toggle" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_ACTION_FAVORITE_NOR; + } + description { + state: "focused_toggle" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_ACTION_FAVORITE_FOC; + } + description { state: "selected" 0.0; inherit: "default" 0.0; image.normal: IMAGE_ACTION_FAVORITE_SEL; @@ -3568,6 +3587,14 @@ group { color: COLOR_TEXT_FOCUS; } description { + state: "default_toggle" 0.0; + inherit: "default" 0.0; + } + description { + state: "focused_toggle" 0.0; + inherit: "focused" 0.0; + } + description { state: "selected" 0.0; inherit: "default" 0.0; color: COLOR_ITEM_SELECTED; @@ -3578,6 +3605,15 @@ group { color: COLOR_TEXT_DISABLED; } } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } } programs { program { @@ -3589,9 +3625,57 @@ group { } } program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "anim,clicked,default"; + action: STATE_SET "focused_toggle" 0.0; + target: "bg"; + target: "menu_icon"; + target: "elm.text"; + transition: TRANSITION_CLICK; + } + program { + name: "anim,clicked,toggle"; + action: STATE_SET "focused" 0.0; + target: "bg"; + target: "menu_icon"; + target: "elm.text"; + transition: TRANSITION_CLICK; + } + program { name: "go_active"; signal: SIG_ELM_FOCUS; source: SIG_SOURCE_ELM; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_NORMAL) + run_program(PROGRAM:"focus,default"); + else + run_program(PROGRAM:"focus,toggle"); + } + } + program { + name: "go_passive"; + signal: SIG_ELM_UNFOCUS; + source: SIG_SOURCE_ELM; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_NORMAL) + run_program(PROGRAM:"unfocus,default"); + else + run_program(PROGRAM:"unfocus,toggle"); + } + } + program { + name: "focus,default"; action: STATE_SET "focused" 0.0; target: "bg"; target: "menu_icon"; @@ -3599,9 +3683,15 @@ group { transition: TRANSITION_FOCUS; } program { - name: "go_passive"; - signal: SIG_ELM_UNFOCUS; - source: SIG_SOURCE_ELM; + name: "focus,toggle"; + action: STATE_SET "focused_toggle" 0.0; + target: "bg"; + target: "menu_icon"; + target: "elm.text"; + transition: TRANSITION_FOCUS; + } + program { + name: "unfocus,default"; action: STATE_SET "default" 0.0; target: "bg"; target: "menu_icon"; @@ -3609,6 +3699,28 @@ group { transition: TRANSITION_FOCUS; } program { + name: "unfocus,toggle"; + action: STATE_SET "default_toggle" 0.0; + target: "bg"; + target: "menu_icon"; + target: "elm.text"; + transition: TRANSITION_FOCUS; + } + program { + name: SIG_ITEM_TOGGLED; + signal: SIG_ITEM_TOGGLED; + source: SIG_SOURCE_SRC; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_NORMAL) { + set_int(cur_state, STATE_TOGGLED); + set_state(PART:"menu_icon","default_toggle",0.0); + } + } + } + program { name: SIG_ITEM_SELECTED; signal: SIG_ITEM_SELECTED; source: SIG_SOURCE_SRC; @@ -3651,6 +3763,16 @@ group { image.normal: IMAGE_ACTION_DELETE_FOC; } description { + state: "default_toggle" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_ACTION_DELETE_NOR; + } + description { + state: "focused_toggle" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_ACTION_DELETE_FOC; + } + description { state: "selected" 0.0; inherit: "default" 0.0; image.normal: IMAGE_ACTION_DELETE_SEL; diff --git a/src/view/action_menu.c b/src/view/action_menu.c index b2241fd..34b682d 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -36,8 +36,10 @@ #define TABLE_PADDING_Y 0 enum _object_type { + ACTION_DISABLED = -1, ACTION_LIVETV_BTN = 0, - ACTION_MENU_BTN, + ACTION_FAVORITE_BTN, + ACTION_DELETE_BTN, ACTION_FAVORITE_GRID }; @@ -54,16 +56,19 @@ struct _priv { Evas_Object *tv_btn; Evas_Object *menu_btn[NUM_MENU_BTN]; + Evas_Object *table; Evas_Object *grid; Elm_Object_Item *selected_it; Eina_List *favorite_list; + app_media_info *mi; int content_type; }; struct _menu_info { + int id; const char *title; const char *style; Eina_Bool disabled; @@ -79,21 +84,25 @@ struct _content_info { static struct _menu_info menu_info[] = { { + .id = ACTION_FAVORITE_BTN, .title = "Favorite", .style = STYLE_BTN_FAVORITE, .disabled = EINA_FALSE }, { + .id = ACTION_DELETE_BTN, .title = "Delete", .style = STYLE_BTN_DELETE, .disabled = EINA_TRUE }, { + .id = ACTION_DISABLED, .title = NULL, .style = STYLE_BTN_EMPTY, .disabled = EINA_TRUE }, { + .id = ACTION_DISABLED, .title = NULL, .style = STYLE_BTN_EMPTY, .disabled = EINA_TRUE @@ -121,6 +130,37 @@ struct _content_info content_info[] = { } }; +static bool _favorite_clicked(struct _priv *priv, Evas_Object *obj) +{ + int r; + bool favorite; + + r = app_contents_favorite_check(CONTENTS_MEDIA, + priv->mi->media_id, &favorite); + if (r != APP_CONTENTS_ERROR_NONE) { + _ERR("failed to check favorite"); + return false; + } + + r = app_contents_favorite_set(CONTENTS_MEDIA, + priv->mi->media_id, !favorite); + if (r != APP_CONTENTS_ERROR_NONE) { + _ERR("failed to set favorite"); + return false; + } + + viewmgr_hide_view(VIEW_ACTION_MENU); + + return true; +} + +static bool _delete_clicked(struct _priv *priv, Evas_Object *obj) +{ + /* It will be implemented later */ + + return true; +} + static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { @@ -142,7 +182,8 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, switch (id) { case ACTION_LIVETV_BTN: - case ACTION_MENU_BTN: + case ACTION_FAVORITE_BTN: + case ACTION_DELETE_BTN: if (!elm_object_focus_get(obj)) elm_object_focus_set(obj, EINA_TRUE); @@ -161,6 +202,27 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, } } +static void _clicked_cb(int id, void *data, Evas_Object *obj) +{ + struct _priv *priv; + + if (!obj || !data) + return; + + priv = data; + + switch (id) { + case ACTION_FAVORITE_BTN: + _favorite_clicked(priv, obj); + break; + case ACTION_DELETE_BTN: + _delete_clicked(priv, obj); + break; + default: + break; + } +} + static void _grid_selected(void *data) { app_media *am; @@ -224,6 +286,7 @@ static void _selected_cb(int id, void *data, Evas_Object *obj, static input_handler _handler = { .key_down = _key_down_cb, .mouse_move = _mouse_move_cb, + .clicked = _clicked_cb, .selected = _selected_cb }; @@ -460,9 +523,7 @@ static bool _draw_livetv_btn(struct _priv *priv) static bool _draw_menu_area(struct _priv *priv) { - Evas_Object *table, *btn; - int i; - int col, row; + Evas_Object *table; table = util_add_table(priv->base, TABLE_PADDING_X, TABLE_PADDING_Y); if (!table) { @@ -470,45 +531,10 @@ static bool _draw_menu_area(struct _priv *priv) return false; } - for (i = 0; i < NUM_MENU_BTN; i++) { - btn = elm_button_add(priv->base); - if (!btn) { - _ERR("failed to create button object"); - evas_object_del(table); - return false; - } - - elm_object_style_set(btn, menu_info[i].style); - elm_object_text_set(btn, menu_info[i].title); - - if (menu_info[i].disabled) - elm_object_disabled_set(btn, EINA_TRUE); - - evas_object_show(btn); - - inputmgr_add_callback(btn, ACTION_MENU_BTN, &_handler, priv); - - elm_object_focus_next_object_set(btn, priv->grid, - ELM_FOCUS_DOWN); - - col = i % MAX_BTN_COL; - row = i / MAX_BTN_COL; - - elm_table_pack(table, btn, col, row, 1, 1); - - priv->menu_btn[i] = btn; - } - - evas_object_show(table); - - elm_object_focus_next_object_set(priv->menu_btn[0], priv->menu_btn[0], - ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(priv->menu_btn[NUM_MENU_BTN - 1], - priv->menu_btn[NUM_MENU_BTN - 1], - ELM_FOCUS_RIGHT); - elm_object_part_content_set(priv->base, PART_ACTION_MENU_AREA, table); + priv->table = table; + return true; } @@ -538,6 +564,70 @@ static bool _draw_favorite_area(struct _priv *priv) return true; } +static void _set_menu_state(Evas_Object *btn, int idx, const char *id) +{ + int r; + bool favorite; + + if (menu_info[idx].disabled) { + elm_object_disabled_set(btn, EINA_TRUE); + return; + } + + r = app_contents_favorite_check(CONTENTS_MEDIA, id, &favorite); + if (r != APP_CONTENTS_ERROR_NONE) { + _ERR("failed to check favorite"); + return; + } + + if (favorite) + elm_object_signal_emit(btn, SIG_ITEM_TOGGLED, SIG_SOURCE_SRC); +} + +static void _update_menu_area(struct _priv *priv) +{ + Evas_Object *btn; + int i; + int col, row; + + elm_table_clear(priv->table, EINA_TRUE); + + for (i = 0; i < NUM_MENU_BTN; i++) { + btn = elm_button_add(priv->base); + if (!btn) { + _ERR("failed to create button object"); + return; + } + + elm_object_style_set(btn, menu_info[i].style); + elm_object_text_set(btn, menu_info[i].title); + + _set_menu_state(btn, i, priv->mi->media_id); + + evas_object_show(btn); + + inputmgr_add_callback(btn, menu_info[i].id, &_handler, priv); + + elm_object_focus_next_object_set(btn, priv->grid, + ELM_FOCUS_DOWN); + + col = i % MAX_BTN_COL; + row = i / MAX_BTN_COL; + + elm_table_pack(priv->table, btn, col, row, 1, 1); + + priv->menu_btn[i] = btn; + } + + evas_object_show(priv->table); + + elm_object_focus_next_object_set(priv->menu_btn[0], priv->menu_btn[0], + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->menu_btn[NUM_MENU_BTN - 1], + priv->menu_btn[NUM_MENU_BTN - 1], + ELM_FOCUS_RIGHT); +} + static void _update_favorite_area(struct _priv *priv) { @@ -577,13 +667,13 @@ static bool _draw_items(struct _priv *priv) return false; } - if (!_draw_favorite_area(priv)) { - _ERR("failed to draw favorite area"); + if (!_draw_menu_area(priv)) { + _ERR("failed to draw menu button"); return false; } - if (!_draw_menu_area(priv)) { - _ERR("failed to draw menu button"); + if (!_draw_favorite_area(priv)) { + _ERR("failed to draw favorite area"); return false; } @@ -593,7 +683,6 @@ static bool _draw_items(struct _priv *priv) static bool _update_items(struct _priv *priv, struct view_update_data *vdata) { app_media *am; - app_media_info *mi; am = eina_list_nth(vdata->list, vdata->index); if (!am) { @@ -601,14 +690,15 @@ static bool _update_items(struct _priv *priv, struct view_update_data *vdata) return false; } - mi = app_media_get_info(am); - if (!mi) { + priv->mi = app_media_get_info(am); + if (!priv->mi) { _ERR("failed to get app media info"); return false; } - priv->content_type = _get_content_type(mi); + priv->content_type = _get_content_type(priv->mi); + _update_menu_area(priv); _update_favorite_area(priv); return true; -- 2.7.4 From 0512ebd1ba5eb907c133a9b1bd62e77556eafd43 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 24 Aug 2015 14:48:04 +0900 Subject: [PATCH 12/16] viewer: adds support the remote controller Change-Id: I91af5a070614d34937cdfa30c5826d00503bb105 Signed-off-by: Minkyu Kang --- src/view/viewer.c | 203 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 157 insertions(+), 46 deletions(-) diff --git a/src/view/viewer.c b/src/view/viewer.c index 276f9ee..e525765 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -650,60 +650,76 @@ static void _pop_view(struct _priv *priv) ui_app_exit(); } -static Eina_Bool _timeout_cb(void *data, int type, void *ei) -{ - _hide_bar(data); - - return ECORE_CALLBACK_CANCEL; -} - -static Eina_Bool _event_cb(void *data, int type, void *ei) +static int _player_get_position(void *data) { struct _priv *priv; if (!data) - return ECORE_CALLBACK_PASS_ON; + return 0; priv = data; - if (type == ECORE_EVENT_KEY_DOWN) { - Evas_Event_Key_Down *ev; - - if (!ei) - return ECORE_CALLBACK_PASS_ON; + return playermgr_get_position(priv->player); +} - ev = ei; +static void _player_set_position(struct _priv *priv, int position) +{ + int ms; - if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) { - if (priv->bar_show) { - _pop_view(priv); - return ECORE_CALLBACK_DONE; - } - } - } + ms = position; - _show_bar(data); + /* set to last position */ + if (position == -1) + ms = playermgr_get_duration(priv->player) - 100; - return ECORE_CALLBACK_PASS_ON; + playermgr_set_position(priv->player, ms, NULL, NULL); } -static int _player_get_position(void *data) +static void _player_play_pause(struct _priv *priv) { - struct _priv *priv; + app_media_info *mi; + player_state_e state; - if (!data) - return 0; + playermgr_get_state(priv->player, &state); - priv = data; + 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; + } - return playermgr_get_position(priv->player); + _remove_thumbnail(priv); + _update_to_player(priv); + + progressbar_start(priv->progress); + playermgr_play(priv->player, mi->file_path, + mi->video->position); + + _add_to_recent(priv); + + break; + default: + _ERR("player was not created"); + break; + } } static void _player_play(struct _priv *priv) { app_media_info *mi; player_state_e state; + struct controller *ctl; playermgr_get_state(priv->player, &state); @@ -713,8 +729,6 @@ static void _player_play(struct _priv *priv) 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: @@ -738,6 +752,36 @@ static void _player_play(struct _priv *priv) _ERR("player was not created"); break; } + + ctl = priv->viewer.ctl[priv->viewer.cur]; + ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PAUSE); + ctl->ops->focus(ctl->handle, PLAY_BTN_LOC, true); +} + +static void _player_pause(struct _priv *priv) +{ + player_state_e state; + struct controller *ctl; + + playermgr_get_state(priv->player, &state); + + switch (state) { + case PLAYER_STATE_PLAYING: + progressbar_pause(priv->progress); + playermgr_pause(priv->player); + break; + case PLAYER_STATE_PAUSED: + case PLAYER_STATE_IDLE: + case PLAYER_STATE_READY: + break; + default: + _ERR("player was not created"); + break; + } + + ctl = priv->viewer.ctl[priv->viewer.cur]; + ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); + ctl->ops->focus(ctl->handle, PLAY_BTN_LOC, true); } static void _player_stop(struct _priv *priv) @@ -767,11 +811,11 @@ static void _player_complete_cb(void *data) priv = data; _set_played_position(priv, 0); - _player_stop(priv); - if (priv->viewer.cur == VIEWER_MOVIE) + if (priv->viewer.cur == VIEWER_MOVIE) { _pop_view(priv); - else if (priv->viewer.cur == VIEWER_VIDEO) { + } else if (priv->viewer.cur == VIEWER_VIDEO) { + _player_stop(priv); _viewer_show(priv); _show_bar(data); } @@ -784,21 +828,18 @@ static struct progressbar_ops _progressbar_ops = { static void _callback_movie(void *data, const char *ev) { struct _priv *priv; - int ms; if (!data || !ev) return; priv = data; - if (!strcmp(ev, SRC_BTN_PREV)) { - playermgr_set_position(priv->player, 0, NULL, NULL); - } else if (!strcmp(ev, SRC_BTN_NEXT)) { - ms = playermgr_get_duration(priv->player); - playermgr_set_position(priv->player, ms - 500, NULL, NULL); - } else if (!strcmp(ev, SRC_BTN_PLAY)) { - _player_play(priv); - } + if (!strcmp(ev, SRC_BTN_PREV)) + _player_set_position(priv, 0); + else if (!strcmp(ev, SRC_BTN_NEXT)) + _player_set_position(priv, -1); + else if (!strcmp(ev, SRC_BTN_PLAY)) + _player_play_pause(priv); } static void _callback_photo(void *data, const char *ev) @@ -832,8 +873,78 @@ static void _callback_video(void *data, const char *ev) _player_stop(priv); _viewer_next(priv); } else if (!strcmp(ev, SRC_BTN_PLAY)) { - _player_play(priv); + _player_play_pause(priv); + } +} + +static Eina_Bool _timeout_cb(void *data, int type, void *ei) +{ + _hide_bar(data); + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool _event_cb(void *data, int type, void *ei) +{ + struct _priv *priv; + + if (!data) + return ECORE_CALLBACK_PASS_ON; + + priv = data; + + if (type == ECORE_EVENT_KEY_DOWN) { + Evas_Event_Key_Down *ev; + + if (!ei) + return ECORE_CALLBACK_PASS_ON; + + ev = ei; + + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + if (priv->bar_show) { + _pop_view(priv); + return ECORE_CALLBACK_DONE; + } + } else if (!strcmp(ev->keyname, KEY_PLAY)) { + if (priv->viewer.cur != VIEWER_PHOTO) + _player_play(priv); + } else if (!strcmp(ev->keyname, KEY_PAUSE)) { + if (priv->viewer.cur != VIEWER_PHOTO) + _player_pause(priv); + } else if (!strcmp(ev->keyname, KEY_STOP)) { + if (priv->viewer.cur == VIEWER_MOVIE) { + _pop_view(priv); + return ECORE_CALLBACK_DONE; + } else if (priv->viewer.cur == VIEWER_VIDEO) { + _player_stop(priv); + _viewer_show(priv); + } + } else if (!strcmp(ev->keyname, KEY_NEXT)) { + if (priv->viewer.cur == VIEWER_MOVIE) { + _player_set_position(priv, -1); + } else if (priv->viewer.cur == VIEWER_PHOTO) { + _viewer_next(priv); + } else if (priv->viewer.cur == VIEWER_VIDEO) { + _player_stop(priv); + _viewer_next(priv); + } + } else if (!strcmp(ev->keyname, KEY_PREVIOUS)) { + if (priv->viewer.cur == VIEWER_MOVIE) { + _player_set_position(priv, 0); + } else if (priv->viewer.cur == VIEWER_PHOTO) { + _viewer_prev(priv); + } else if (priv->viewer.cur == VIEWER_VIDEO) { + _player_stop(priv); + _viewer_prev(priv); + } + } } + + _show_bar(data); + + return ECORE_CALLBACK_PASS_ON; } static bool _ui_init(struct _priv *priv) -- 2.7.4 From f96da25b729ccd1d209ad3ac12bffeee2f0c419b Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Mon, 24 Aug 2015 15:09:37 +0900 Subject: [PATCH 13/16] action_view: update grid item in base view when favorite value is changed Change-Id: I20b96ef4cd3599563c84b9061ff3360ef0e746ec Signed-off-by: Jehun Lim --- include/util/listmgr.h | 1 + include/view.h | 1 + src/layout/gallery.c | 3 +++ src/layout/movie.c | 3 +++ src/layout/music.c | 3 +++ src/util/listmgr.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++---- src/view/action_menu.c | 48 ++++++++++++++++++++++++++++++++--------- src/view/base.c | 23 +++++++++++++++----- 8 files changed, 121 insertions(+), 19 deletions(-) diff --git a/include/util/listmgr.h b/include/util/listmgr.h index ff7077c..1820593 100644 --- a/include/util/listmgr.h +++ b/include/util/listmgr.h @@ -53,6 +53,7 @@ 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_content_item(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); diff --git a/include/view.h b/include/view.h index 653bd34..3e9b2ad 100644 --- a/include/view.h +++ b/include/view.h @@ -38,6 +38,7 @@ struct view_update_data { /* view update type */ enum update_type { UPDATE_CONTENT = 0, + UPDATE_CONTENT_ITEM, UPDATE_FOCUS, UPDATE_PLAY_INFO, UPDATE_PLAYER, diff --git a/src/layout/gallery.c b/src/layout/gallery.c index d701a2c..46fcc00 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -455,6 +455,9 @@ static void _update(void *layout_data, int update_type, void *data) case UPDATE_CONTENT: _update_content_list(priv); break; + case UPDATE_CONTENT_ITEM: + listmgr_update_content_item(priv->listmgr); + break; case UPDATE_FOCUS: if (!data) { _ERR("invalid argument"); diff --git a/src/layout/movie.c b/src/layout/movie.c index 59589f8..475db18 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -716,6 +716,9 @@ static void _update(void *layout_data, int update_type, void *data) _update_content_list(priv); _update_recent_item(priv, -1); break; + case UPDATE_CONTENT_ITEM: + listmgr_update_content_item(priv->listmgr); + break; case UPDATE_FOCUS: if (!data) { _ERR("invalid argument"); diff --git a/src/layout/music.c b/src/layout/music.c index 0920703..f3ce0b1 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -643,6 +643,9 @@ static void _update(void *layout_data, int update_type, void *data) _update_content_list(priv); _update_playing_item(priv, -1); break; + case UPDATE_CONTENT_ITEM: + listmgr_update_content_item(priv->listmgr); + break; case UPDATE_PLAY_INFO: if (!data) { _ERR("invalid argument"); diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 65af1d6..0f8b84b 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -256,6 +256,18 @@ static void _item_focused_cb(void *data, Elm_Object_Item *it, lmgr->focused_it = it; } +static void _add_grid_item_callback(Elm_Object_Item *it, void *data) +{ + elm_object_item_signal_callback_add(it, SIG_ITEM_FOCUSED, + SIG_SOURCE_EDC, _item_focused_cb, data); +} + +static void _delete_grid_item_callback(Elm_Object_Item *it) +{ + elm_object_item_signal_callback_del(it, SIG_ITEM_FOCUSED, + SIG_SOURCE_EDC, _item_focused_cb); +} + static void _realized_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *it) { @@ -266,8 +278,7 @@ static void _realized_cb(int id, void *data, Evas_Object *obj, lmgr = data; - elm_object_item_signal_callback_add(it, SIG_ITEM_FOCUSED, - SIG_SOURCE_EDC, _item_focused_cb, lmgr); + _add_grid_item_callback(it, lmgr); } static void _unrealized_cb(int id, void *data, Evas_Object *obj, @@ -276,8 +287,7 @@ static void _unrealized_cb(int id, void *data, Evas_Object *obj, if (!it) return; - elm_object_item_signal_callback_del(it, SIG_ITEM_FOCUSED, - SIG_SOURCE_EDC, _item_focused_cb); + _delete_grid_item_callback(it); } static input_handler _grid_handler = { @@ -519,6 +529,46 @@ bool listmgr_focus_content_list(struct listmgr *lmgr, int index, bool update) return true; } +void _update_grid_realized_items(struct listmgr *lmgr, Eina_List *list) +{ + Eina_List *l; + Elm_Object_Item *it; + + EINA_LIST_FOREACH(list, l, it) { + _delete_grid_item_callback(it); + + elm_gengrid_item_update(it); + _add_grid_item_callback(it, lmgr); + } +} + +bool listmgr_update_content_item(struct listmgr *lmgr) +{ + Eina_List *box_item, *grid_realized; + Eina_List *l; + Evas_Object *ly, *grid; + + if (!lmgr) { + _ERR("failed to get listmgr"); + return false; + } + + box_item = elm_box_children_get(lmgr->box); + + EINA_LIST_FOREACH(box_item, l, ly) { + grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); + if (!grid) { + _ERR("failed to get grid object"); + return false; + } + + grid_realized = elm_gengrid_realized_items_get(grid); + _update_grid_realized_items(lmgr, grid_realized); + } + + return true; +} + bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list) { Evas_Object *ly, *btn, *grid; diff --git a/src/view/action_menu.c b/src/view/action_menu.c index 34b682d..b8b899a 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -63,7 +63,7 @@ struct _priv { Eina_List *favorite_list; - app_media_info *mi; + app_media *am; int content_type; }; @@ -132,25 +132,46 @@ struct _content_info content_info[] = { static bool _favorite_clicked(struct _priv *priv, Evas_Object *obj) { + app_media_info *mi; int r; bool favorite; + r = media_content_connect(); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return false; + } + + mi = app_media_get_info(priv->am); + if (!mi) { + _ERR("failed to get app media info"); + media_content_disconnect(); + return false; + } + r = app_contents_favorite_check(CONTENTS_MEDIA, - priv->mi->media_id, &favorite); + mi->media_id, &favorite); if (r != APP_CONTENTS_ERROR_NONE) { _ERR("failed to check favorite"); + media_content_disconnect(); return false; } r = app_contents_favorite_set(CONTENTS_MEDIA, - priv->mi->media_id, !favorite); + mi->media_id, !favorite); if (r != APP_CONTENTS_ERROR_NONE) { _ERR("failed to set favorite"); + media_content_disconnect(); return false; } + app_media_update(priv->am); + + viewmgr_update_view(VIEW_BASE, UPDATE_CONTENT_ITEM, NULL); viewmgr_hide_view(VIEW_ACTION_MENU); + media_content_disconnect(); + return true; } @@ -587,11 +608,18 @@ static void _set_menu_state(Evas_Object *btn, int idx, const char *id) static void _update_menu_area(struct _priv *priv) { Evas_Object *btn; + app_media_info *mi; int i; int col, row; elm_table_clear(priv->table, EINA_TRUE); + mi = app_media_get_info(priv->am); + if (!mi) { + _ERR("failed to get app media info"); + return; + } + for (i = 0; i < NUM_MENU_BTN; i++) { btn = elm_button_add(priv->base); if (!btn) { @@ -602,7 +630,7 @@ static void _update_menu_area(struct _priv *priv) elm_object_style_set(btn, menu_info[i].style); elm_object_text_set(btn, menu_info[i].title); - _set_menu_state(btn, i, priv->mi->media_id); + _set_menu_state(btn, i, mi->media_id); evas_object_show(btn); @@ -682,21 +710,21 @@ static bool _draw_items(struct _priv *priv) static bool _update_items(struct _priv *priv, struct view_update_data *vdata) { - app_media *am; + app_media_info *mi; - am = eina_list_nth(vdata->list, vdata->index); - if (!am) { + priv->am = eina_list_nth(vdata->list, vdata->index); + if (!priv->am) { _ERR("failed to get app media"); return false; } - priv->mi = app_media_get_info(am); - if (!priv->mi) { + mi = app_media_get_info(priv->am); + if (!mi) { _ERR("failed to get app media info"); return false; } - priv->content_type = _get_content_type(priv->mi); + priv->content_type = _get_content_type(mi); _update_menu_area(priv); _update_favorite_area(priv); diff --git a/src/view/base.c b/src/view/base.c index b1998b6..92a1cea 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -565,31 +565,44 @@ static void _update(void *view_data, int update_type, void *data) return; } - if (!data) { - _ERR("invalid argument"); - return; - } - priv = view_data; switch (update_type) { case UPDATE_FOCUS: case UPDATE_PLAY_INFO: + if (!data) + goto err; + vdata = data; layoutmgr_update_layout(priv->lmgr, g_menu_item[priv->current_layout].layout_id, update_type, vdata); break; + case UPDATE_CONTENT_ITEM: + layoutmgr_update_layout(priv->lmgr, + g_menu_item[priv->current_layout].layout_id, + update_type, NULL); + break; case UPDATE_FAVORITE: + if (!data) + goto err; + _update_favorite_view(priv, data); break; case UPDATE_RECENT: + if (!data) + goto err; + _update_recent_view(priv, data); break; default: break; } + + return; +err: + _ERR("invalid argument"); } static void _pause(void *view_data) -- 2.7.4 From cdc64e21a94e0a4e7ab7855fdb7c1936a199a232 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 24 Aug 2015 20:37:24 +0900 Subject: [PATCH 14/16] add visual effect when showing/hiding the view Change-Id: I1e54d2474746076ca6aae3d1b94f9d2104357e55 Signed-off-by: Minkyu Kang --- include/define.h | 6 ++++++ res/edc/view/base.edc | 42 ++++++++++++++++++++++++++++++++++++++++++ res/edc/view/mplayer.edc | 42 ++++++++++++++++++++++++++++++++++++++++++ res/edc/view/viewer.edc | 39 +++++++++++++++++++++++++++++++++++++++ src/view/base.c | 17 +++++++++++++++++ src/view/mplayer.c | 17 +++++++++++++++++ src/view/viewer.c | 17 +++++++++++++++++ 7 files changed, 180 insertions(+) diff --git a/include/define.h b/include/define.h index 0d68bd9..ec9b141 100644 --- a/include/define.h +++ b/include/define.h @@ -56,6 +56,8 @@ #define COLOR_ITEM_DIVIDER 224 224 224 255 #define COLOR_LIST_BG 244 244 244 255 +#define SHOW_VIEW_INTERVAL 0.1 + /* part */ #define PART_ELM_TEXT_TITLE "elm.text.title" #define PART_ELM_TEXT_TITLE2 "elm.text.title2" @@ -82,11 +84,15 @@ #define SIG_SOURCE_EDC "edc" #define SIG_SOURCE_ELM "elm" #define SIG_SOURCE_SRC "src" +#define SIG_SHOW_VIEW "show,view" +#define SIG_HIDE_VIEW "hide,view" /* transition */ #define TRANSITION_FOCUS DECELERATE 0.20 #define TRANSITION_CLICK DECELERATE 0 #define TRANSITION_SHOW_BAR LINEAR 0.20 #define TRANSITION_SHOW_ICON LINEAR 0.35 +#define TRANSITION_SHOW_VIEW SINUSOIDAL 0.20 +#define TRANSITION_SHOW_BASE_VIEW DECELERATE 0.01 #endif /* __AIR_MEDIAHUB_DEFINE_H__ */ diff --git a/res/edc/view/base.edc b/res/edc/view/base.edc index b5aefc2..08dd30c 100644 --- a/res/edc/view/base.edc +++ b/res/edc/view/base.edc @@ -138,6 +138,48 @@ group { fixed: 0 1; } } + + /* CURTAIN */ + part { + name: "curtain"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + align: 0.0 0.0; + color: 247 247 247 50; + } + description { + state: "show" 0.0; + color: 255 255 255 0; + } + } + } + + programs { + program { + name: SIG_SHOW_VIEW; + signal: SIG_SHOW_VIEW; + source: ""; + action: STATE_SET "show" 0.0; + target: "curtain"; + transition: TRANSITION_SHOW_BASE_VIEW; + } + program { + name: SIG_HIDE_VIEW; + signal: SIG_HIDE_VIEW; + source: ""; + action: STATE_SET "default" 0.0; + target: "curtain"; + } } } diff --git a/res/edc/view/mplayer.edc b/res/edc/view/mplayer.edc index 21c9654..13e8b80 100644 --- a/res/edc/view/mplayer.edc +++ b/res/edc/view/mplayer.edc @@ -445,5 +445,47 @@ group { rel2.to: "rightarea_bg"; } } + + /* CURTAIN */ + part { + name: "curtain"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + align: 0.0 0.0; + color: 255 255 255 255; + } + description { + state: "show" 0.0; + color: 255 255 255 0; + } + } + } + + programs { + program { + name: SIG_SHOW_VIEW; + signal: SIG_SHOW_VIEW; + source: ""; + action: STATE_SET "show" 0.0; + target: "curtain"; + transition: TRANSITION_SHOW_VIEW; + } + program { + name: SIG_HIDE_VIEW; + signal: SIG_HIDE_VIEW; + source: ""; + action: STATE_SET "default" 0.0; + target: "curtain"; + } } } diff --git a/res/edc/view/viewer.edc b/res/edc/view/viewer.edc index ead1612..7412824 100644 --- a/res/edc/view/viewer.edc +++ b/res/edc/view/viewer.edc @@ -476,10 +476,49 @@ group { visible: 0; } } + + /* CURTAIN */ + part { + name: "curtain"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + align: 0.0 0.0; + color: 255 255 255 255; + } + description { + state: "show" 0.0; + color: 255 255 255 0; + } + } } programs { program { + name: SIG_SHOW_VIEW; + signal: SIG_SHOW_VIEW; + source: ""; + action: STATE_SET "show" 0.0; + target: "curtain"; + transition: TRANSITION_SHOW_VIEW; + } + program { + name: SIG_HIDE_VIEW; + signal: SIG_HIDE_VIEW; + source: ""; + action: STATE_SET "default" 0.0; + target: "curtain"; + } + program { name: SIG_HIDE_BAR; signal: SIG_HIDE_BAR; source: ""; diff --git a/src/view/base.c b/src/view/base.c index 92a1cea..6ec6a6e 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -527,6 +527,20 @@ static Evas_Object *_create(Evas_Object *win, void *data) return base; } +static Eina_Bool _show_view(void *data) +{ + struct _priv *priv; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + priv = data; + + elm_object_signal_emit(priv->base, SIG_SHOW_VIEW, ""); + + return ECORE_CALLBACK_CANCEL; +} + static void _show(void *view_data) { struct _priv *priv; @@ -539,6 +553,8 @@ static void _show(void *view_data) priv = view_data; evas_object_show(priv->base); + + ecore_timer_add(SHOW_VIEW_INTERVAL, _show_view, priv); } static void _hide(void *view_data) @@ -553,6 +569,7 @@ static void _hide(void *view_data) priv = view_data; evas_object_hide(priv->base); + elm_object_signal_emit(priv->base, SIG_HIDE_VIEW, ""); } static void _update(void *view_data, int update_type, void *data) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 5109d7c..fd7746d 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -1003,6 +1003,20 @@ err: return NULL; } +static Eina_Bool _show_view(void *data) +{ + struct _priv *priv; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + priv = data; + + elm_object_signal_emit(priv->base, SIG_SHOW_VIEW, ""); + + return ECORE_CALLBACK_CANCEL; +} + static void _show(void *view_data) { struct _priv *priv; @@ -1022,6 +1036,8 @@ static void _show(void *view_data) _player_play(priv); evas_object_show(priv->base); + + ecore_timer_add(SHOW_VIEW_INTERVAL, _show_view, priv); } static void _hide(void *view_data) @@ -1040,6 +1056,7 @@ static void _hide(void *view_data) media_content_disconnect(); evas_object_hide(priv->base); + elm_object_signal_emit(priv->base, SIG_HIDE_VIEW, ""); } static void _update(void *view_data, int update_type, void *data) diff --git a/src/view/viewer.c b/src/view/viewer.c index e525765..78dfae0 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -1053,6 +1053,20 @@ err: return NULL; } +static Eina_Bool _show_view(void *data) +{ + struct _priv *priv; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + priv = data; + + elm_object_signal_emit(priv->base, SIG_SHOW_VIEW, ""); + + return ECORE_CALLBACK_CANCEL; +} + static void _show(void *view_data) { struct _priv *priv; @@ -1071,6 +1085,8 @@ static void _show(void *view_data) timeout_handler_enable(priv->timeout, true); evas_object_show(priv->base); + + ecore_timer_add(SHOW_VIEW_INTERVAL, _show_view, priv); } static void _hide(void *view_data) @@ -1091,6 +1107,7 @@ static void _hide(void *view_data) media_content_disconnect(); evas_object_hide(priv->base); + elm_object_signal_emit(priv->base, SIG_HIDE_VIEW, ""); } static void _update(void *view_data, int update_type, void *data) -- 2.7.4 From f3a0c459e083d4fce2910477b760048d50cad59d Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Mon, 24 Aug 2015 21:14:26 +0900 Subject: [PATCH 15/16] base: update playing info when favorite value is changed Change-Id: Ic23cf3e223ea846d7b68570de9800065749d8897 Signed-off-by: Jehun Lim --- src/layout/movie.c | 1 + src/layout/music.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/layout/movie.c b/src/layout/movie.c index 475db18..9d6561c 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -718,6 +718,7 @@ static void _update(void *layout_data, int update_type, void *data) break; case UPDATE_CONTENT_ITEM: listmgr_update_content_item(priv->listmgr); + _update_recent_item(priv, -1); break; case UPDATE_FOCUS: if (!data) { diff --git a/src/layout/music.c b/src/layout/music.c index f3ce0b1..e031fb6 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -645,6 +645,7 @@ static void _update(void *layout_data, int update_type, void *data) break; case UPDATE_CONTENT_ITEM: listmgr_update_content_item(priv->listmgr); + _update_playing_item(priv, -1); break; case UPDATE_PLAY_INFO: if (!data) { -- 2.7.4 From 62d4e69593ccbe170c1ff706733683001983a4bc Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 21 Aug 2015 14:49:34 +0900 Subject: [PATCH 16/16] action_menu: add no favorite content area Change-Id: Ic6dec7c882023d7d769fc13ec06a7dfe56c6f5f1 Signed-off-by: Jehun Lim --- include/define.h | 1 + include/view/action_menu.h | 9 ++++ res/edc/view/action_menu.edc | 120 ++++++++++++++++++++++++++++++++++++++++--- src/view/action_menu.c | 58 +++++++++++++++++---- 4 files changed, 171 insertions(+), 17 deletions(-) diff --git a/include/define.h b/include/define.h index ec9b141..dc8da71 100644 --- a/include/define.h +++ b/include/define.h @@ -55,6 +55,7 @@ #define COLOR_ITEM_BORDER 194 194 194 255 #define COLOR_ITEM_DIVIDER 224 224 224 255 #define COLOR_LIST_BG 244 244 244 255 +#define COLOR_NO_CONTENT_BG 229 229 229 255 #define SHOW_VIEW_INTERVAL 0.1 diff --git a/include/view/action_menu.h b/include/view/action_menu.h index 7b0e8d9..ee4b687 100644 --- a/include/view/action_menu.h +++ b/include/view/action_menu.h @@ -22,12 +22,21 @@ /* group */ #define GRP_ACTION_MENU_VIEW "group.action_menu_view" +#define GRP_ACTION_NO_CONTENT "group.action_no_content" /* part */ #define PART_ACTION_TV_BTN "part.action_tv_btn" #define PART_ACTION_MENU_AREA "part.action_menu_area" #define PART_ACTION_FAVORITE_TITLE "part.action_favorite_title" #define PART_ACTION_FAVORITE_AREA "part.action_favorite_area" +#define PART_ACTION_NO_CONTENT_BG "part.action_no_content_bg" + +#define PART_NO_CONTENT_BG "part.no_content_bg" +#define PART_NO_CONTENT_TEXT "part.no_content_text" + +/* signal */ +#define SIG_SHOW_NO_CONTENT "show,no_content" +#define SIG_HIDE_NO_CONTENT "hide,no_content" /* style */ #define STYLE_BTN_LIVETV "action_btn_livetv" diff --git a/res/edc/view/action_menu.edc b/res/edc/view/action_menu.edc index 7514ebf..d5f594b 100644 --- a/res/edc/view/action_menu.edc +++ b/res/edc/view/action_menu.edc @@ -170,7 +170,7 @@ group { relative: 1.0 1.0; } rel2.to: PART_ACTION_MENU_AREA; - min: 10 40; + min: 30 40; align: 1.0 0.0; fixed: 1 1; } @@ -201,7 +201,7 @@ group { } } part { - name: "padding_favorite_area"; + name: "padding_favorite_area_left_top"; type: SPACER; scale: 1; description { @@ -210,10 +210,26 @@ group { to: PART_ACTION_FAVORITE_TITLE; relative: 0.0 1.0; } - rel2.to: PART_ACTION_FAVORITE_TITLE; + rel2 { + to: PART_ACTION_FAVORITE_TITLE; + relative: 0.0 1.0; + } min: 0 30; - align: 0.5 0.0; - fixed: 0 1; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "padding_favorite_area_right_bottom"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 10 0; + align: 1.0 1.0; + fixed: 1 1; } } part { @@ -223,14 +239,102 @@ group { description { state: "default" 0.0; rel1 { - to: "padding_favorite_area"; + to: "padding_favorite_area_left_top"; + relative: 0.0 1.0; + } + rel2 { + to: "padding_favorite_area_right_bottom"; + relative: 0.0 0.0; + } + } + } + part { + name: "padding_bg_no_content_right_bottom"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 1.0 1.0; + rel2.relative: 1.0 1.0; + min: 30 32; + align: 1.0 1.0; + fixed: 1 1; + } + } + part { + name: PART_ACTION_NO_CONTENT_BG; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_favorite_area_left_top"; relative: 0.0 1.0; } rel2 { - to_x: "padding_favorite_area"; - to_y: "bg"; + to: "padding_bg_no_content_right_bottom"; + relative: 0.0 0.0; + } + } + } + } +} + +group { + name: GRP_ACTION_NO_CONTENT; + parts { + part { + name: PART_NO_CONTENT_BG; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: COLOR_NO_CONTENT_BG; + visible: 0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: PART_NO_CONTENT_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + text { + font: FONT_LIGHT; + size: 32; + align: 0.5 0.5; } + color: COLOR_TEXT_INDEX; + visible: 0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; } } } + programs { + program { + name: SIG_SHOW_NO_CONTENT; + signal: SIG_SHOW_NO_CONTENT; + source: SIG_SOURCE_SRC; + action: STATE_SET "show" 0.0; + target: PART_NO_CONTENT_BG; + target: PART_NO_CONTENT_TEXT; + } + program { + name: SIG_HIDE_NO_CONTENT; + signal: SIG_HIDE_NO_CONTENT; + source: SIG_SOURCE_SRC; + action: STATE_SET "default" 0.0; + target: PART_NO_CONTENT_BG; + target: PART_NO_CONTENT_TEXT; + } + } } diff --git a/src/view/action_menu.c b/src/view/action_menu.c index b8b899a..1560753 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -58,6 +58,7 @@ struct _priv { Evas_Object *menu_btn[NUM_MENU_BTN]; Evas_Object *table; + Evas_Object *ly; Evas_Object *grid; Elm_Object_Item *selected_it; @@ -80,6 +81,8 @@ struct _content_info { const char *style; int app_contents_type; + + const char *no_content; }; static struct _menu_info menu_info[] = { @@ -114,19 +117,22 @@ struct _content_info content_info[] = { .grid_x = GRID_ITEM_X_MOVIE, .grid_y = GRID_ITEM_Y_MOVIE, .style = STYLE_GRID_MOVIE_ITEM_FAVORITE, - .app_contents_type = CONTENTS_MOVIE + .app_contents_type = CONTENTS_MOVIE, + .no_content = "No favorite Movies" }, { .grid_x = GRID_ITEM_X_GALLERY, .grid_y = GRID_ITEM_Y_GALLERY, .style = STYLE_GRID_GALLERY_ITEM_FAVORITE, - .app_contents_type = CONTENTS_GALLERY + .app_contents_type = CONTENTS_GALLERY, + .no_content = "No favorite Contents" }, { .grid_x = GRID_ITEM_X_MUSIC, .grid_y = GRID_ITEM_Y_MUSIC, .style = STYLE_GRID_SONG_ITEM_FAVORITE, - .app_contents_type = CONTENTS_MUSIC + .app_contents_type = CONTENTS_MUSIC, + .no_content = "No favorite Songs" } }; @@ -561,14 +567,25 @@ static bool _draw_menu_area(struct _priv *priv) static bool _draw_favorite_area(struct _priv *priv) { - Evas_Object *grid; + Evas_Object *ly, *grid; elm_object_part_text_set(priv->base, PART_ACTION_FAVORITE_TITLE, TEXT_FAVORITE); + ly = elm_layout_add(priv->base); + if (!ly) { + _ERR("failed to create layout object"); + return false; + } + + elm_layout_file_set(ly, EDJEFILE, GRP_ACTION_NO_CONTENT); + + elm_object_part_content_set(priv->base, PART_ACTION_NO_CONTENT_BG, ly); + grid = util_add_gengrid(priv->base, 0, 0, EINA_FALSE); if (!grid) { _ERR("failed to create gengrid object"); + evas_object_del(ly); return false; } @@ -580,6 +597,7 @@ static bool _draw_favorite_area(struct _priv *priv) elm_object_part_content_set(priv->base, PART_ACTION_FAVORITE_AREA, grid); + priv->ly = ly; priv->grid = grid; return true; @@ -656,12 +674,30 @@ static void _update_menu_area(struct _priv *priv) ELM_FOCUS_RIGHT); } +static void _update_no_content_area(struct _priv *priv) +{ + if (!priv->favorite_list) { + elm_object_signal_emit(priv->ly, SIG_SHOW_NO_CONTENT, + SIG_SOURCE_SRC); + elm_object_part_text_set(priv->ly, PART_NO_CONTENT_TEXT, + content_info[priv->content_type]. + no_content); + + elm_object_focus_allow_set(priv->grid, EINA_FALSE); + } else { + elm_object_signal_emit(priv->ly, SIG_HIDE_NO_CONTENT, + SIG_SOURCE_SRC); + + elm_object_focus_allow_set(priv->grid, EINA_TRUE); + } +} + static void _update_favorite_area(struct _priv *priv) { Elm_Gengrid_Item_Class *ic; Elm_Object_Item *it; - Eina_List *favorite_l, *l; + Eina_List *l; app_media *am; int type; @@ -669,15 +705,19 @@ static void _update_favorite_area(struct _priv *priv) type = priv->content_type; + if (priv->favorite_list) + _free_favorite_list(priv->favorite_list); + + priv->favorite_list = _get_favorite_list( + content_info[type].app_contents_type); + elm_gengrid_item_size_set(priv->grid, elm_config_scale_get() * content_info[type].grid_x, elm_config_scale_get() * content_info[type].grid_y); ic = _get_grid_item_class(type); - favorite_l = _get_favorite_list(content_info[type].app_contents_type); - - EINA_LIST_FOREACH(favorite_l, l, am) { + EINA_LIST_FOREACH(priv->favorite_list, l, am) { it = elm_gengrid_item_append(priv->grid, ic, am, NULL, NULL); elm_object_item_data_set(it, am); @@ -685,7 +725,7 @@ static void _update_favorite_area(struct _priv *priv) elm_gengrid_item_class_free(ic); - priv->favorite_list = favorite_l; + _update_no_content_area(priv); } static bool _draw_items(struct _priv *priv) -- 2.7.4