From dca3a030bce0111f11eee9863a11e6448d97410d Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 31 Aug 2015 12:13:19 +0900 Subject: [PATCH 01/16] controller: find actual location of button Change-Id: Ifbde0ac06917f0012f860113cc04a191a4ac098d Signed-off-by: Minkyu Kang --- src/util/controller.c | 23 ++++++++++++++++++++--- src/view/viewer.c | 48 +++++++++++++++++++++++++----------------------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/util/controller.c b/src/util/controller.c index 79ec34d..942c201 100644 --- a/src/util/controller.c +++ b/src/util/controller.c @@ -30,6 +30,7 @@ struct _event_cb { struct _control { Evas_Object *obj; char *part; + int loc; }; struct _priv { @@ -116,6 +117,7 @@ static bool _add_control(void *handle, const char *name, int loc, ctl->obj = btn; ctl->part = strdup(buf); + ctl->loc = loc; p->list = eina_list_append(p->list, ctl); @@ -140,6 +142,21 @@ static void _add_callback(void *handle, p->cb.data = data; } +static struct _control *_get_control_loc(Eina_List *list, int loc) +{ + Eina_List *l; + struct _control *ctl; + + EINA_LIST_FOREACH(list, l, ctl) { + if (ctl->loc == loc) + break; + + ctl = NULL; + } + + return ctl; +} + static void _focus(void *handle, int loc, bool foc) { struct _priv *p; @@ -151,7 +168,7 @@ static void _focus(void *handle, int loc, bool foc) } p = handle; - ctl = eina_list_nth(p->list, loc); + ctl = _get_control_loc(p->list, loc); if (ctl && ctl->obj) elm_object_focus_set(ctl->obj, foc); @@ -168,7 +185,7 @@ static void _signal(void *handle, int loc, const char *signal) } p = handle; - ctl = eina_list_nth(p->list, loc); + ctl = _get_control_loc(p->list, loc); if (ctl && ctl->obj) elm_object_signal_emit(ctl->obj, signal, ""); @@ -278,7 +295,7 @@ static Evas_Object *_get_object(void *handle, int loc) p = handle; - ctl = eina_list_nth(p->list, loc); + ctl = _get_control_loc(p->list, loc); if (!ctl) return NULL; diff --git a/src/view/viewer.c b/src/view/viewer.c index 6fce492..f3e768a 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -36,12 +36,15 @@ #define STYLE_VIEWER_BTN "viewer_btn" #define PART_VIEWER_BTN "control_btn" -#define PLAY_BTN_LOC 1 #define VIEWER_TIMEOUT 3.0 #define VIEWER_SEPARATOR "/ " #define VIDEO_COPYRIGHT "Unknown" +#define BTN_LOC_PREV 0 +#define BTN_LOC_PLAY 2 +#define BTN_LOC_NEXT 4 + enum { VIEWER_MOVIE, VIEWER_PHOTO, @@ -89,41 +92,41 @@ struct _btn_info { static struct _btn_info btn_movie[] = { { .name = SRC_BTN_PREV, - .loc = 1, + .loc = BTN_LOC_PREV, }, { .name = SRC_BTN_PLAY, - .loc = 2, + .loc = BTN_LOC_PLAY, }, { .name = SRC_BTN_NEXT, - .loc = 3, + .loc = BTN_LOC_NEXT, }, }; static struct _btn_info btn_photo[] = { { .name = SRC_BTN_GALLERY_PREV, - .loc = 0, + .loc = BTN_LOC_PREV, }, { .name = SRC_BTN_GALLERY_NEXT, - .loc = 4, + .loc = BTN_LOC_NEXT, }, }; static struct _btn_info btn_video[] = { { .name = SRC_BTN_GALLERY_PREV, - .loc = 0, + .loc = BTN_LOC_PREV, }, { .name = SRC_BTN_PLAY, - .loc = 2, + .loc = BTN_LOC_PLAY, }, { .name = SRC_BTN_GALLERY_NEXT, - .loc = 4, + .loc = BTN_LOC_NEXT, }, }; @@ -145,19 +148,19 @@ static struct _viewer_info viewer_info[] = { { .btns = btn_movie, .btn_count = 3, - .focus_loc = 1, + .focus_loc = BTN_LOC_PLAY, .callback = _callback_movie, }, { .btns = btn_photo, .btn_count = 2, - .focus_loc = 1, + .focus_loc = BTN_LOC_NEXT, .callback = _callback_photo, }, { .btns = btn_video, .btn_count = 3, - .focus_loc = 2, + .focus_loc = BTN_LOC_NEXT, .callback = _callback_video, }, }; @@ -465,17 +468,17 @@ static bool _viewer_show(struct _priv *priv) switch (priv->playlist.dir) { case DIR_PREV: - loc = 0; + loc = BTN_LOC_PREV; break; case DIR_NEXT: - loc = info->btn_count - 1; + loc = BTN_LOC_NEXT; break; case DIR_NONE: default: loc = info->focus_loc; if (id == VIEWER_MOVIE) { ctl->ops->signal(ctl->handle, - PLAY_BTN_LOC, SIG_SET_PAUSE); + BTN_LOC_PLAY, SIG_SET_PAUSE); } break; } @@ -546,7 +549,7 @@ static bool _viewer_prev(struct _priv *priv) struct controller *ctl; ctl = priv->viewer.ctl[priv->viewer.cur]; - ctl->ops->signal(ctl->handle, 0, SIG_SET_UNFOCUS); + ctl->ops->signal(ctl->handle, BTN_LOC_PREV, SIG_SET_UNFOCUS); _viewer_hide(priv); @@ -571,8 +574,7 @@ static bool _viewer_next(struct _priv *priv) struct controller *ctl; ctl = priv->viewer.ctl[priv->viewer.cur]; - ctl->ops->signal(ctl->handle, ctl->ops->get_count(ctl->handle) - 1, - SIG_SET_UNFOCUS); + ctl->ops->signal(ctl->handle, BTN_LOC_NEXT, SIG_SET_UNFOCUS); _viewer_hide(priv); @@ -742,8 +744,8 @@ static void _player_play(struct _priv *priv) } 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); + ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PAUSE); + ctl->ops->focus(ctl->handle, BTN_LOC_PLAY, true); } static void _player_pause(struct _priv *priv) @@ -768,8 +770,8 @@ static void _player_pause(struct _priv *priv) } 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); + ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PLAY); + ctl->ops->focus(ctl->handle, BTN_LOC_PLAY, true); } static void _player_stop(struct _priv *priv) @@ -786,7 +788,7 @@ static void _player_stop(struct _priv *priv) playermgr_stop(priv->player); ctl = priv->viewer.ctl[priv->viewer.cur]; - ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); + ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PLAY); } static void _player_complete_cb(void *data) -- 2.7.4 From 2edb324f8b9abffa4dd36735b6c8cb4c86d75d11 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 31 Aug 2015 12:47:52 +0900 Subject: [PATCH 02/16] viewer: add rotate button Change-Id: I0304226dc2b42990010428d3e81c159d1994a60e Signed-off-by: Minkyu Kang --- include/view/viewer.h | 3 ++ res/edc/images/btn_view_contr_rotate_foc.png | Bin 0 -> 3938 bytes res/edc/images/btn_view_contr_rotate_nor.png | Bin 0 -> 4008 bytes res/edc/view/viewer.edc | 21 ++++++++++++++ res/edc/widgets/button.edc | 41 +++++++++++++++++++++++++++ src/view/viewer.c | 7 ++++- 6 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 res/edc/images/btn_view_contr_rotate_foc.png create mode 100644 res/edc/images/btn_view_contr_rotate_nor.png diff --git a/include/view/viewer.h b/include/view/viewer.h index 47307dc..2674ae8 100644 --- a/include/view/viewer.h +++ b/include/view/viewer.h @@ -57,6 +57,7 @@ #define SRC_BTN_NEXT "next" #define SRC_BTN_GALLERY_PREV "prev_gallery" #define SRC_BTN_GALLERY_NEXT "next_gallery" +#define SRC_BTN_ROTATE "rotate" /* images */ #define IMAGE_VIEWER_FAVORITE "ic_title_favorite.png" @@ -76,5 +77,7 @@ #define IMAGE_VIEWER_PHOTO_PREV_NORMAL "btn_view_slide_previous_nor.png" #define IMAGE_VIEWER_PHOTO_NEXT_FOCUS "btn_view_slide_next_foc.png" #define IMAGE_VIEWER_PHOTO_NEXT_NORMAL "btn_view_slide_next_nor.png" +#define IMAGE_VIEWER_ROTATE_FOCUS "btn_view_contr_rotate_foc.png" +#define IMAGE_VIEWER_ROTATE_NORMAL "btn_view_contr_rotate_nor.png" #endif /* __AIR_MEDIAHUB_VIEW_VIEWER_H__ */ diff --git a/res/edc/images/btn_view_contr_rotate_foc.png b/res/edc/images/btn_view_contr_rotate_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..343f481e0184548358754876b8c0849e898334d7 GIT binary patch literal 3938 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 literal 0 HcmV?d00001 diff --git a/res/edc/view/viewer.edc b/res/edc/view/viewer.edc index 2c8b446..94f7b1e 100644 --- a/res/edc/view/viewer.edc +++ b/res/edc/view/viewer.edc @@ -283,6 +283,7 @@ group { visible: 0; } } + /* controller buttons */ part { name: "control_btn0"; type: SWALLOW; @@ -383,6 +384,26 @@ group { align: 0.0 0.5; } } + /* extra buttons */ + part { + name: "control_btn5"; + type: SWALLOW; + clip_to: "bottomarea"; + scale: 1; + description { + state: "default" 0.0; + min: 114 143; + rel1 { + to: "bottomarea"; + } + rel2 { + to: "bottomarea"; + relative: 0.0 1.0; + } + fixed: 1 1; + align: 0.0 0.5; + } + } part { name: "padding_time"; type: SPACER; diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 60f2caa..197a689 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -964,6 +964,47 @@ group { } group { + name: "elm/button/base/viewer_btn_rotate"; + inherit: "elm/button/base/viewer_btn_prev"; + images { + image: IMAGE_VIEWER_ROTATE_NORMAL COMP; + image: IMAGE_VIEWER_ROTATE_FOCUS COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 114 143; + image { + normal: IMAGE_VIEWER_ROTATE_NORMAL; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + image { + normal: IMAGE_VIEWER_ROTATE_FOCUS; + } + } + description { + state: "clicked" 0.0; + image { + normal: IMAGE_VIEWER_ROTATE_FOCUS; + } + } + } + } + programs { + program { + name: "emit,signal"; + action: SIGNAL_EMIT SIG_BTN_CALLBACK SRC_BTN_ROTATE; + } + } +} + +group { name: "elm/button/base/music_btn_prev"; inherit: "elm/button/base/viewer_btn_prev"; images { diff --git a/src/view/viewer.c b/src/view/viewer.c index f3e768a..6fd38d5 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -44,6 +44,7 @@ #define BTN_LOC_PREV 0 #define BTN_LOC_PLAY 2 #define BTN_LOC_NEXT 4 +#define BTN_LOC_ROTATE 5 enum { VIEWER_MOVIE, @@ -113,6 +114,10 @@ static struct _btn_info btn_photo[] = { .name = SRC_BTN_GALLERY_NEXT, .loc = BTN_LOC_NEXT, }, + { + .name = SRC_BTN_ROTATE, + .loc = BTN_LOC_ROTATE, + }, }; static struct _btn_info btn_video[] = { @@ -153,7 +158,7 @@ static struct _viewer_info viewer_info[] = { }, { .btns = btn_photo, - .btn_count = 2, + .btn_count = 3, .focus_loc = BTN_LOC_NEXT, .callback = _callback_photo, }, -- 2.7.4 From 7e5a2cfcc325051357db973300b17cfabb789b63 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 31 Aug 2015 15:25:39 +0900 Subject: [PATCH 03/16] mplayer: fix location of buttons Change-Id: Id6e5d17ddbf1ffe281f3b6b36d71d12e227bea26 Signed-off-by: Minkyu Kang --- src/view/mplayer.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 97e4e33..ed4972f 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -36,7 +36,12 @@ #define STYLE_MUSIC_BTN "music_btn" #define PART_MUSIC_BTN "control_btn" -#define PLAY_BTN_LOC 2 + +#define BTN_LOC_SHUFFLE 0 +#define BTN_LOC_PREV 1 +#define BTN_LOC_PLAY 2 +#define BTN_LOC_NEXT 3 +#define BTN_LOC_REPEAT 4 enum _repeat_state { REPEAT_ALL, @@ -79,23 +84,23 @@ struct _btn_info { static struct _btn_info btn_player[] = { { .name = SRC_BTN_MUSIC_SHUFFLE, - .loc = 0, + .loc = BTN_LOC_SHUFFLE, }, { .name = SRC_BTN_MUSIC_PREV, - .loc = 1, + .loc = BTN_LOC_PREV, }, { .name = SRC_BTN_MUSIC_PLAY, - .loc = 2, + .loc = BTN_LOC_PLAY, }, { .name = SRC_BTN_MUSIC_NEXT, - .loc = 3, + .loc = BTN_LOC_NEXT, }, { .name = SRC_BTN_MUSIC_REPEAT, - .loc = 4, + .loc = BTN_LOC_REPEAT, }, }; @@ -479,7 +484,7 @@ static void _player_pause(struct _priv *priv) } ctl = priv->ctl; - ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); + ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PLAY); } static void _player_play(struct _priv *priv) @@ -526,7 +531,7 @@ static void _player_play(struct _priv *priv) } ctl = priv->ctl; - ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PAUSE); + ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PAUSE); } static void _player_stop(struct _priv *priv) @@ -537,7 +542,7 @@ static void _player_stop(struct _priv *priv) playermgr_stop(priv->player); ctl = priv->ctl; - ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); + ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PLAY); } static void _player_complete_cb(void *data) -- 2.7.4 From 2402daa162b8e90309fe03482bc1d8a5dd640dfa Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 31 Aug 2015 15:26:42 +0900 Subject: [PATCH 04/16] viewer: adds support rotating image Change-Id: I058640a6d39668a20b491ddc5eb9dbd020f40763 Signed-off-by: Minkyu Kang --- src/view/viewer.c | 74 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/src/view/viewer.c b/src/view/viewer.c index 6fd38d5..a29d1d8 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -41,6 +41,7 @@ #define VIEWER_SEPARATOR "/ " #define VIDEO_COPYRIGHT "Unknown" +#define BTN_LOC_NONE -1 #define BTN_LOC_PREV 0 #define BTN_LOC_PLAY 2 #define BTN_LOC_NEXT 4 @@ -53,21 +54,15 @@ enum { VIEWER_MAX }; -enum { - DIR_NONE, - DIR_PREV, - DIR_NEXT -}; - struct _viewer { struct controller *ctl[VIEWER_MAX]; int cur; + int foc; }; struct _playlist { Eina_List *list; int cur; - int dir; }; struct _priv { @@ -432,6 +427,44 @@ static void _set_played_position(struct _priv *priv, int position) app_media_update(am); } +static void _set_image_orientation(struct _priv *priv) +{ + app_media *am; + app_media_info *mi; + Evas_Object *image, *obj; + + am = eina_list_nth(priv->playlist.list, priv->playlist.cur); + if (!am) { + _ERR("failed to get app_media"); + return; + } + + mi = _get_current_media_info(priv); + if (!mi) { + _ERR("failed to getting media info"); + return; + } + + image = elm_image_add(priv->base); + if (!image) { + _ERR("failed to add image"); + return; + } + + elm_image_file_set(image, mi->file_path, NULL); + elm_image_orient_set(image, ELM_IMAGE_ROTATE_270); + + obj = elm_image_object_get(image); + if (!obj) { + _ERR("failed to get image object"); + return; + } + + evas_object_image_save(obj, mi->file_path, NULL, "quality=100"); + + app_media_update(am); +} + static void _update_to_player(struct _priv *priv) { viewmgr_update_view(VIEW_MPLAYER, UPDATE_PLAYER, NULL); @@ -471,22 +504,15 @@ static bool _viewer_show(struct _priv *priv) ctl->ops->show(ctl->handle); - switch (priv->playlist.dir) { - case DIR_PREV: - loc = BTN_LOC_PREV; - break; - case DIR_NEXT: - loc = BTN_LOC_NEXT; - break; - case DIR_NONE: - default: + loc = priv->viewer.foc; + if (loc == BTN_LOC_NONE) { loc = info->focus_loc; if (id == VIEWER_MOVIE) { ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PAUSE); } - break; } + ctl->ops->signal(ctl->handle, loc, SIG_SET_FOCUS); ctl->ops->focus(ctl->handle, loc, true); @@ -565,7 +591,7 @@ static bool _viewer_prev(struct _priv *priv) else priv->playlist.cur--; - priv->playlist.dir = DIR_PREV; + priv->viewer.foc = BTN_LOC_PREV; r = _viewer_show(priv); @@ -590,7 +616,7 @@ static bool _viewer_next(struct _priv *priv) else priv->playlist.cur++; - priv->playlist.dir = DIR_NEXT; + priv->viewer.foc = BTN_LOC_NEXT; r = _viewer_show(priv); @@ -850,6 +876,12 @@ static void _callback_photo(void *data, const char *ev) _viewer_prev(priv); else if (!strcmp(ev, SRC_BTN_GALLERY_NEXT)) _viewer_next(priv); + else if (!strcmp(ev, SRC_BTN_ROTATE)) { + _set_image_orientation(priv); + + priv->viewer.foc = BTN_LOC_ROTATE; + _viewer_show(priv); + } } static void _callback_video(void *data, const char *ev) @@ -1015,7 +1047,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->playlist.list = NULL; priv->playlist.cur = 0; - priv->playlist.dir = DIR_NONE; + priv->viewer.foc = BTN_LOC_NONE; player = playermgr_create(win); if (!player) { @@ -1125,7 +1157,7 @@ static void _update(void *view_data, int update_type, void *data) priv->playlist.list = vdata->list; priv->playlist.cur = vdata->index; - priv->playlist.dir = DIR_NONE; + priv->viewer.foc = BTN_LOC_NONE; break; default: break; -- 2.7.4 From ace9214f748faeeff547097ec79b01b7f565121b Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 31 Aug 2015 17:16:18 +0900 Subject: [PATCH 05/16] viewer: set to 0 played_position if movie is almost done Change-Id: I7e4cbccbf2f52bfce1298419535e37a529f85545 Signed-off-by: Minkyu Kang --- src/view/viewer.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/view/viewer.c b/src/view/viewer.c index a29d1d8..f91a8ab 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -37,6 +37,7 @@ #define STYLE_VIEWER_BTN "viewer_btn" #define PART_VIEWER_BTN "control_btn" +#define POSITION_MARGIN 500 #define VIEWER_TIMEOUT 3.0 #define VIEWER_SEPARATOR "/ " #define VIDEO_COPYRIGHT "Unknown" @@ -394,12 +395,23 @@ static const char *_get_current_media_id(struct _priv *priv) return mi->media_id; } -static void _set_played_position(struct _priv *priv, int position) +static void _set_played_position(struct _priv *priv) { video_meta_h video; app_media *am; + int position; + int duration; int r; + if (priv->viewer.cur != VIEWER_MOVIE) + return; + + position = playermgr_get_position(priv->player); + duration = playermgr_get_duration(priv->player); + + if (position > duration - POSITION_MARGIN) + position = 0; + am = eina_list_nth(priv->playlist.list, priv->playlist.cur); if (!am) { _ERR("failed to get app_media"); @@ -433,6 +445,9 @@ static void _set_image_orientation(struct _priv *priv) app_media_info *mi; Evas_Object *image, *obj; + if (priv->viewer.cur != VIEWER_PHOTO) + return; + am = eina_list_nth(priv->playlist.list, priv->playlist.cur); if (!am) { _ERR("failed to get app_media"); @@ -808,12 +823,8 @@ static void _player_pause(struct _priv *priv) static void _player_stop(struct _priv *priv) { struct controller *ctl; - int position; - if (priv->viewer.cur == VIEWER_MOVIE) { - position = playermgr_get_position(priv->player); - _set_played_position(priv, position); - } + _set_played_position(priv); progressbar_stop(priv->progress); playermgr_stop(priv->player); @@ -831,8 +842,6 @@ static void _player_complete_cb(void *data) priv = data; - _set_played_position(priv, 0); - if (priv->viewer.cur == VIEWER_MOVIE) { _pop_view(priv); } else if (priv->viewer.cur == VIEWER_VIDEO) { -- 2.7.4 From aa7fa473958480a4b9cb6b599d039825af807084 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 31 Aug 2015 17:39:48 +0900 Subject: [PATCH 06/16] player: set rotation to 0 Change-Id: I06a4915800f44d1bfeb1a9a83c48adf15f982aff Signed-off-by: Minkyu Kang --- src/util/playermgr.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/util/playermgr.c b/src/util/playermgr.c index d484431..d4d8967 100644 --- a/src/util/playermgr.c +++ b/src/util/playermgr.c @@ -278,6 +278,13 @@ bool playermgr_play(struct playermgr *m, const char *path, int ms) _ERR("player: set_display_mode error (%d)", r); return false; } + + r = player_set_display_rotation(m->player, + PLAYER_DISPLAY_ROTATION_NONE); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set_display_rotation error (%d)", r); + return false; + } } r = player_prepare(m->player); -- 2.7.4 From 0eaea3830d8a0d70ace1d9d04c4e294409e22623 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 31 Aug 2015 18:37:59 +0900 Subject: [PATCH 07/16] viewer: set scroller policy to off Change-Id: I99985381556546b82e94742050bae25ab0dab16d Signed-off-by: Minkyu Kang --- src/view/viewer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/view/viewer.c b/src/view/viewer.c index f91a8ab..29f3a7f 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -297,8 +297,8 @@ static void _draw_contents(struct _priv *priv, int id, app_media_info *mi) elm_object_focus_allow_set(obj, EINA_FALSE); elm_scroller_policy_set(obj, - ELM_SCROLLER_POLICY_AUTO, - ELM_SCROLLER_POLICY_AUTO); + ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); /* * set this photocam object to photo_pre (preloaded photo) -- 2.7.4 From f51516fedeab9e0b14142c7ec45ae4d7d742e531 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Mon, 31 Aug 2015 21:31:48 +0900 Subject: [PATCH 08/16] add ctxpopup util file Change-Id: I541f1872f2db5d575a5e11ffa763836671ecc1bd Signed-off-by: Jehun Lim --- CMakeLists.txt | 1 + include/define.h | 1 + include/util/ctxpopup.h | 30 +++++++ include/util/util.h | 4 +- res/edc/widgets/ctxpopup.edc | 2 +- src/util/ctxpopup.c | 198 +++++++++++++++++++++++++++++++++++++++++++ src/util/listmgr.c | 2 +- src/util/util.c | 27 +++++- 8 files changed, 260 insertions(+), 5 deletions(-) create mode 100644 include/util/ctxpopup.h create mode 100644 src/util/ctxpopup.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f4c9db..5045400 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,7 @@ src/util/listmgr.c src/util/timeout_handler.c src/util/util.c src/util/playermgr.c +src/util/ctxpopup.c src/util/progressbar.c src/data/mediadata.c ) diff --git a/include/define.h b/include/define.h index 50e92a1..01ab6b9 100644 --- a/include/define.h +++ b/include/define.h @@ -89,6 +89,7 @@ #define SIG_SOURCE_SRC "src" #define SIG_SHOW_VIEW "show,view" #define SIG_HIDE_VIEW "hide,view" +#define SIG_DISMISSED "dismissed" /* transition */ #define TRANSITION_FOCUS DECELERATE 0.20 diff --git a/include/util/ctxpopup.h b/include/util/ctxpopup.h new file mode 100644 index 0000000..b479373 --- /dev/null +++ b/include/util/ctxpopup.h @@ -0,0 +1,30 @@ +/* + * 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_CTXPOPUP_H__ +#define __AIR_MEDIAHUB_CTXPOPUP_H__ + +struct ctxpopup; + +struct ctxpopup *ctxpopup_create(Evas_Object *base, + const char *ctxpopup_style, const char *btn_style, + const char **text, int text_size); +void ctxpopup_show(struct ctxpopup *m, int x, int y); +void ctxpopup_set_callback(struct ctxpopup *m, void (*func)(void *, int), + void *data); +void ctxpopup_destroy(struct ctxpopup *m); + +#endif diff --git a/include/util/util.h b/include/util/util.h index 17bf998..a9ece63 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -21,7 +21,9 @@ #include void util_set_alpha_color(Evas_Object *obj, int alpha); -Evas_Object *util_add_box(Evas_Object *base); +Evas_Object *util_add_button(Evas_Object *base, const char *style, + const char *text); +Evas_Object *util_add_box(Evas_Object *base, Eina_Bool horizontal); Evas_Object *util_add_gengrid(Evas_Object *base, int item_size_x, int item_size_y, Eina_Bool horizontal); Evas_Object *util_add_genlist(Evas_Object *base); diff --git a/res/edc/widgets/ctxpopup.edc b/res/edc/widgets/ctxpopup.edc index 1e3b2d7..188d688 100644 --- a/res/edc/widgets/ctxpopup.edc +++ b/res/edc/widgets/ctxpopup.edc @@ -107,7 +107,7 @@ group { programs { program { name: "hide"; - signal: SIGNAL_ELM_HIDE; + signal: SIG_ELM_HIDE; source: SIG_SOURCE_ELM; action: SIGNAL_EMIT "elm,action,hide,finished" ""; } diff --git a/src/util/ctxpopup.c b/src/util/ctxpopup.c new file mode 100644 index 0000000..04f5047 --- /dev/null +++ b/src/util/ctxpopup.c @@ -0,0 +1,198 @@ +/* + * 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 "define.h" +#include "util/ctxpopup.h" +#include "util/util.h" + +struct _selected_cb { + void (*func)(void *data, int id); + void *data; +}; + +struct ctxpopup { + Evas_Object *popup; + struct _selected_cb cb; +}; + +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + struct ctxpopup *m; + + if (!data || !ev) + return; + + m = data; + + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) + ctxpopup_destroy(m); +} + +static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Mouse_Move *ev) +{ + if (!obj) + return; + + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); +} + +static void _clicked_cb(int id, void *data, Evas_Object *obj) +{ + struct ctxpopup *m; + + if (!data) + return; + + m = data; + + if (m->cb.func) + m->cb.func(m->cb.data, id); + + ctxpopup_destroy(m); +} + +static void _dismissed_cb(void *data, Evas_Object *obj, void *event_info) +{ + struct ctxpopup *m; + + if (!data) + return; + + m = data; + + ctxpopup_destroy(m); +} + +static input_handler _handler = { + .key_down = _key_down_cb, + .mouse_move = _mouse_move_cb, + .clicked = _clicked_cb +}; + +void ctxpopup_set_callback(struct ctxpopup *m, void (*func)(void *, int), + void *data) +{ + if (!m) { + _ERR("failed to get ctxpopup info"); + return; + } + + m->cb.func = func; + m->cb.data = data; +} + +void ctxpopup_show(struct ctxpopup *m, int x, int y) +{ + if (!m) { + _ERR("failed to get ctxpopup info"); + return; + } + + evas_object_move(m->popup, x * elm_config_scale_get(), + y * elm_config_scale_get()); + + evas_object_show(m->popup); +} + +struct ctxpopup *ctxpopup_create(Evas_Object *base, const char *ctxpopup_style, + const char *btn_style, const char **text, int text_size) +{ + struct ctxpopup *m; + Evas_Object *ctxpopup, *box, *btn; + Evas_Object *firstbtn; + int i; + + if (!base || !text || text_size <= 0) { + _ERR("invalid argument"); + return NULL; + } + + m = calloc(1, sizeof(*m)); + if (!m) { + _ERR("failed to allocate"); + return NULL; + } + + ctxpopup = elm_ctxpopup_add(base); + if (!ctxpopup) { + _ERR("failed to create ctxpopup object"); + free(m); + return NULL; + } + + if (ctxpopup_style) + elm_object_style_set(ctxpopup, ctxpopup_style); + + box = util_add_box(ctxpopup, EINA_FALSE); + if (!box) { + _ERR("failed to add box"); + return false; + } + + elm_box_padding_set(box, 0, 0); + + for (i = 0; i < text_size; i++) { + btn = util_add_button(box, btn_style, text[i]); + if (!btn) { + _ERR("failed to add button"); + evas_object_del(ctxpopup); + return false; + } + + elm_box_pack_end(box, btn); + + evas_object_show(btn); + + inputmgr_add_callback(btn, i, &_handler, m); + + if (i == 0) + firstbtn = btn; + } + + elm_object_focus_next_object_set(firstbtn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, firstbtn, ELM_FOCUS_DOWN); + + elm_object_content_set(ctxpopup, box); + + evas_object_smart_callback_add(ctxpopup, SIG_DISMISSED, + _dismissed_cb, m); + + m->popup = ctxpopup; + + return m; +} + +void ctxpopup_destroy(struct ctxpopup *m) +{ + if (!m) { + _ERR("failed to get ctxpopup info"); + return; + } + + evas_object_hide(m->popup); + evas_object_del(m->popup); + + free(m); +} diff --git a/src/util/listmgr.c b/src/util/listmgr.c index a96e005..857d2a0 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -690,7 +690,7 @@ bool listmgr_draw_list_area(struct listmgr *lmgr) inputmgr_add_callback(scr, LISTMGR_SCROLLER, &_handler, lmgr); - box = util_add_box(scr); + box = util_add_box(scr, EINA_TRUE); if (!box) { _ERR("failed to create box object"); evas_object_del(scr); diff --git a/src/util/util.c b/src/util/util.c index d7b0e06..60d8b3b 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -35,7 +35,30 @@ void util_set_alpha_color(Evas_Object *obj, int alpha) evas_object_color_set(obj, r, g, b, alpha); } -Evas_Object *util_add_box(Evas_Object *base) +Evas_Object *util_add_button(Evas_Object *base, const char *style, + const char *text) +{ + Evas_Object *btn; + + if (!base) + return NULL; + + btn = elm_button_add(base); + if (!btn) { + _ERR("failed to create button object"); + return NULL; + } + + if (style) + elm_object_style_set(btn, style); + + if (text) + elm_object_text_set(btn, text); + + return btn; +} + +Evas_Object *util_add_box(Evas_Object *base, Eina_Bool horizontal) { Evas_Object *box; @@ -50,7 +73,7 @@ Evas_Object *util_add_box(Evas_Object *base) evas_object_size_hint_align_set(box, 0.0, EVAS_HINT_FILL); evas_object_size_hint_weight_set(box, 0.0, EVAS_HINT_EXPAND); - elm_box_horizontal_set(box, EINA_TRUE); + elm_box_horizontal_set(box, horizontal); return box; } -- 2.7.4 From 66df2042e5d1d21c38fecc109c8773eb559a7367 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 1 Sep 2015 15:53:10 +0900 Subject: [PATCH 09/16] viewer: add zoom button Change-Id: I77e246785ceba006124c581adf41a226bbeb92eb Signed-off-by: Minkyu Kang --- include/view/viewer.h | 3 +++ res/edc/images/btn_view_contr_zoom_foc.png | Bin 0 -> 1872 bytes res/edc/images/btn_view_contr_zoom_nor.png | Bin 0 -> 2022 bytes res/edc/view/viewer.edc | 20 +++++++++++++++ res/edc/widgets/button.edc | 40 +++++++++++++++++++++++++++++ src/view/viewer.c | 7 ++++- 6 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 res/edc/images/btn_view_contr_zoom_foc.png create mode 100644 res/edc/images/btn_view_contr_zoom_nor.png diff --git a/include/view/viewer.h b/include/view/viewer.h index 2674ae8..559402b 100644 --- a/include/view/viewer.h +++ b/include/view/viewer.h @@ -58,6 +58,7 @@ #define SRC_BTN_GALLERY_PREV "prev_gallery" #define SRC_BTN_GALLERY_NEXT "next_gallery" #define SRC_BTN_ROTATE "rotate" +#define SRC_BTN_ZOOM "zoom" /* images */ #define IMAGE_VIEWER_FAVORITE "ic_title_favorite.png" @@ -79,5 +80,7 @@ #define IMAGE_VIEWER_PHOTO_NEXT_NORMAL "btn_view_slide_next_nor.png" #define IMAGE_VIEWER_ROTATE_FOCUS "btn_view_contr_rotate_foc.png" #define IMAGE_VIEWER_ROTATE_NORMAL "btn_view_contr_rotate_nor.png" +#define IMAGE_VIEWER_ZOOM_FOCUS "btn_view_contr_zoom_foc.png" +#define IMAGE_VIEWER_ZOOM_NORMAL "btn_view_contr_zoom_nor.png" #endif /* __AIR_MEDIAHUB_VIEW_VIEWER_H__ */ diff --git a/res/edc/images/btn_view_contr_zoom_foc.png b/res/edc/images/btn_view_contr_zoom_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..da4574045e22e7dfbf434bf86c4f616425473c30 GIT binary patch literal 1872 zcmbVN3rrJt7_Z`M1{B2?KI-j2lwu!ueOF3tdo5IHVZ4P*ExiLeXs=ukXce70jUckf zOYIbOA}%VTqN30taWfH7gE-^DL+7UGbW9@=6%4W~0!~9*vdi6l|NnR2?|c1!UoJOX z7wj={_Cy+u=Aj8eA}C2vPvL}d)Z5|M*G~y=QWZx=;z?wdp1^2w6i>tejY*%3MPPc= zo_+-jq|w}xj8So9oHkTqz)dW@%Z6n$StvA(7AUh>^oCT71QM}iqge_*bJl}^5tV|m zd@V<7QDP~^kTnDrxkeXdSd(fHqo6DZ2((Ek2PTZv12$8d*($L~!2!P#YVA_9L14gy zOqGJ~l8V!Y14^9006vS$G;kmY5C~Whk1r5FivgGe!E6q73z!g3!WT$jAuxD>R5Suj zl0+ct!C2Hz3Z{^xMZ#uhWo5ClxGbDVWqE#35Sn@p~{2CS`Q1ol3S5v{FJ zb_>Riz^r%%VW7?<$!7>m_3qPwT!vIOk}$$Z9g02;!3`NE%uH$!DM)=`p+;1K2suhV zmk)D9h)BhQAQ6uvSF2Qfo?H!yg<{2!kCCuEj)=oma1od*7D14TuaL{t3ZaNE7r`Pm zA5sosHD)WRHyf~_xJD}OAXfQFtVBs*dJ-q1a6D~@0pTe)iCa@}3!sb?0E=RcW)#n| z`n!(jU9|{C7&9?cP2eVApuZC12=QU6M2<)$f|U?eEd+@bA_2k^t6)Tl$VFT}IEY36 zPtVv?GHe$){zaA{6~#c;a+vzmW_WloGc_>;H5wb{o^_)pZi5DqN7-6C_h?hS2r z&zf`Wht<+czwM~^-AoT%;=I1S$xY^WhfMw{$mwXgmR8xE;_DeCM!>0_pXH4CNQ?%j zxRf7@Q3V6a_X6<+M-^-cS^ALxrVc2P#e@T{=!~uom{U^n^6uo0vaZmY6YY`feX7n` zs?;S#%YL8#$`Mn!Xr>khXF7iNGvxR6#nhCCGM*KGXKD&?Ydk=Nx1_bzw`wdtj3ONh ztTC~V?q9^a$X)xBe%gNY(=$3Apthu{u`r}D|?yd`Zq^srW(2gJL zSX&sUemxNq-1B`x=v4dOxS+z#7iIQO$_z`Ge2bQ pfAZ8tWfxIL6d$s8x9saNvuLz@;r4`PMX&20r%~yUO2z6;{{RGYtpfl6 literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_view_contr_zoom_nor.png b/res/edc/images/btn_view_contr_zoom_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d69d496ad8a37772c8db09c9c2f7ed7f8262f7 GIT binary patch literal 2022 zcmbVNc~BE)6c6>N^`ttWSUWC@rB%tXn>!^+$R>aSazweb7?KTyklnD^n1C>Nv>4Q? zV69b)*jBEpXrXAW?N~e_xGh>Gwc^=YU=S6s;#D2{1;JLw=^x$MZ{PR5eed_~-J+Q2 zurVVik7Th}V|vsgn6Mol7}7!@hgk!Ft8Bg1i+EkK*a3ZCt-Xmuu>hSKnKBO!;o4;_Xfqh1at z2%~sW7A2lx49}(T_}plXF4v@!>fzb5pkRj#0GM%F3pvbLgjME{!~M82u=lXJFw`$X zo8<6QrxK%LASFrRkdVV?>v#wPi9{SkAQXv^APD6lD3=Fr5gQT6gd!O#h6XMeSflg? zSsbPwumw(XID@7wGA`F{w{z@#4oRhR5vf$_!9YLLvoKO;GvfpufyrU;hNCy?WtfW~e{EGUH3^qaZ|{L?uC$2#6Lzq@fZKCXlL7Oo=HZeBk?2UH$*b z85cOi^)$!7nq`m$I?%Iy*81S^YnYo(SDJM>8 zk`H!jCm$T0o0aRW9$_?&Gi^JqyL6=1&R+R`l?~^X&xU+5ePRv1-#QzUBi{(fNV+=B zU9r>IY5(Smzn|djt?!#lXHC6N)#P?O8a{jBDY>=zxJI|{YHe27?!>bw^6gA;jSARP8t&i2rSVqlI zOz7hqb#0|>AG8&>eb)9WJZcoTYiIfKIHW;3chh7hn+aoV3?9*LNH083`qh3t=XcYa z;>0h5tea-!@15Tf^mFfqhXByukW!O8wyVpFNvglrtH?={lGXJK_q8MuyX1xkO+J2m zj}Z}5>ZjCZJy?0Hx2J<}o5I`)2Og^Rk@vIB>s_KJ9koZ%(gOdF+@}1gWi1^(nCs{) zCYBL19H!3u;hp>&`}69j#E!w#dG^+dYiB?1@V|TWFIoAu{m5BgOueiuO_Q0|<=pWk z<@%wxdT&3k@~v;nE|sc#$-dg_7pfObhmWRLwik6yzg!x<$;(|869qm*XRPAFWP6JU zM)O2fH`jl*py0hItgvxTy%K53{bI>5ptHQScv9wvf4D(a&@yf&qpO;~Jz+wz|Lp}g zuTRR{b8=TvqjygAeoHeQzMF^zG~pJeMpAORQWVL^;2nTiLkb z0dcTGceu7}^^U^sKR;hbRt3TVKXBg}cWALV#5(lx)E1vDv3rh{oHW!8>nn7f-*IDN z{=19z?OWJ=BxU18eP`WANn@*Asqq=xKH1o_JY@5z{YdkHi}r@Qu7YxP{-)~g=*^ar z+fB`{P29aA=$H8|!9OAV@^g2q_pWuNu4;7jr1;)TCX(BeTG{g|B`0>fO|9+|ODFDD z%(6@%DYYI$Qv}<`n8tT+E_?KOkMzSbW?|1HMbWyhzPhiQ_nZZV=~}ceJEyc<+=*_y z-xyL^10T*l*}W{~i%6H#b#(5ndjUf(1g#gYzk?p=I>m-{N7iJx@3$xPJtkIMR0gl1 z*IhZVb*Zy5tf}m6!)le`OquKUyo5{f6?3BvWC`wjF_;?OUM-#BYK)v0xG_inTS@VE zcRrcPN5mn{pz&LtTc2+Ik%I-MRusJdc=Xf}(^3sXbknfrf_qKTUmfu&3h$q#=gEtc yH85u{P8M8}>IHihF9Q(I6KFhOI-RMnjAl(@j$MyQVW0H;c_UQOSWW2S6@LRAc?vfG literal 0 HcmV?d00001 diff --git a/res/edc/view/viewer.edc b/res/edc/view/viewer.edc index 94f7b1e..29dd7a6 100644 --- a/res/edc/view/viewer.edc +++ b/res/edc/view/viewer.edc @@ -405,6 +405,26 @@ group { } } part { + name: "control_btn6"; + type: SWALLOW; + clip_to: "bottomarea"; + scale: 1; + description { + state: "default" 0.0; + min: 114 143; + rel1 { + to: "control_btn5"; + relative: 1.0 0.5; + } + rel2 { + to: "control_btn5"; + relative: 1.0 0.5; + } + fixed: 1 1; + align: 0.0 0.5; + } + } + part { name: "padding_time"; type: SPACER; scale: 1; diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 197a689..c796b32 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -1005,6 +1005,46 @@ group { } group { + name: "elm/button/base/viewer_btn_zoom"; + inherit: "elm/button/base/viewer_btn_rotate"; + images { + image: IMAGE_VIEWER_ZOOM_NORMAL COMP; + image: IMAGE_VIEWER_ZOOM_FOCUS COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + image { + normal: IMAGE_VIEWER_ZOOM_NORMAL; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + image { + normal: IMAGE_VIEWER_ZOOM_FOCUS; + } + } + description { + state: "clicked" 0.0; + image { + normal: IMAGE_VIEWER_ZOOM_FOCUS; + } + } + } + } + programs { + program { + name: "emit,signal"; + action: SIGNAL_EMIT SIG_BTN_CALLBACK SRC_BTN_ZOOM; + } + } +} + +group { name: "elm/button/base/music_btn_prev"; inherit: "elm/button/base/viewer_btn_prev"; images { diff --git a/src/view/viewer.c b/src/view/viewer.c index 29f3a7f..ca82aad 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -47,6 +47,7 @@ #define BTN_LOC_PLAY 2 #define BTN_LOC_NEXT 4 #define BTN_LOC_ROTATE 5 +#define BTN_LOC_ZOOM 6 enum { VIEWER_MOVIE, @@ -114,6 +115,10 @@ static struct _btn_info btn_photo[] = { .name = SRC_BTN_ROTATE, .loc = BTN_LOC_ROTATE, }, + { + .name = SRC_BTN_ZOOM, + .loc = BTN_LOC_ZOOM, + }, }; static struct _btn_info btn_video[] = { @@ -154,7 +159,7 @@ static struct _viewer_info viewer_info[] = { }, { .btns = btn_photo, - .btn_count = 3, + .btn_count = 4, .focus_loc = BTN_LOC_NEXT, .callback = _callback_photo, }, -- 2.7.4 From 3ff38cb8a35e74d5343b0f9adb6c4019d492a8a5 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 1 Sep 2015 18:18:30 +0900 Subject: [PATCH 10/16] delete notify object when timeout Change-Id: I979eec4904fe3009662ca8d83abb41fbb02aa5c6 Signed-off-by: Jehun Lim --- include/define.h | 1 + src/util/util.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/include/define.h b/include/define.h index 01ab6b9..9719c5a 100644 --- a/include/define.h +++ b/include/define.h @@ -90,6 +90,7 @@ #define SIG_SHOW_VIEW "show,view" #define SIG_HIDE_VIEW "hide,view" #define SIG_DISMISSED "dismissed" +#define SIG_TIMEOUT "timeout" /* transition */ #define TRANSITION_FOCUS DECELERATE 0.20 diff --git a/src/util/util.c b/src/util/util.c index 60d8b3b..adac378 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -19,6 +19,7 @@ #include #include +#include "define.h" #include "util/util.h" void util_set_alpha_color(Evas_Object *obj, int alpha) @@ -152,6 +153,14 @@ Evas_Object *util_add_image(Evas_Object *base, const char *file) return image; } +static void _notify_timeout(void *data, Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + evas_object_del(obj); +} + Evas_Object *util_add_notify(Evas_Object *base, const char *notify_style, const char *label_style, const char *text, double time) { @@ -173,6 +182,8 @@ Evas_Object *util_add_notify(Evas_Object *base, const char *notify_style, EVAS_HINT_EXPAND); elm_notify_align_set(notify, 0.0, 1.0); elm_notify_timeout_set(notify, time); + evas_object_smart_callback_add(notify, SIG_TIMEOUT, + _notify_timeout, NULL); label = elm_label_add(notify); if (!label) { -- 2.7.4 From 38f65f0ad62960892a2abc98ccbbf0eeafca1a25 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 1 Sep 2015 19:49:25 +0900 Subject: [PATCH 11/16] listmgr: delete grid item focused callback Change-Id: Idedcb84fd0cb23c3ab3944c56271fdff41fb42d1 Signed-off-by: Jehun Lim --- include/define.h | 1 - res/edc/widgets/gengrid.edc | 15 ------------ src/util/listmgr.c | 59 ++++----------------------------------------- 3 files changed, 5 insertions(+), 70 deletions(-) diff --git a/include/define.h b/include/define.h index 9719c5a..1e702ad 100644 --- a/include/define.h +++ b/include/define.h @@ -75,7 +75,6 @@ #define SIG_BTN_CLICKED "btn,clicked" #define SIG_BTN_SELECTED "btn,selected" #define SIG_BTN_UNSELECTED "btn,unselected" -#define SIG_ITEM_FOCUSED "item,focused" #define SIG_ITEM_SELECTED "item,selected" #define SIG_ITEM_UNSELECTED "item,unselected" #define SIG_ITEM_TOGGLED "item,toggled" diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index b0e3eba..04b7876 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -441,11 +441,6 @@ group { target: "part_focus3"; target: "defaultbg_text"; transition: TRANSITION_FOCUS; - after: "item_focused"; - } - program { - name: "item_focused"; - action: SIGNAL_EMIT SIG_ITEM_FOCUSED SIG_SOURCE_EDC; } program { name: "go_passive"; @@ -897,11 +892,6 @@ group { target: "part_focus4"; target: PART_ELM_TEXT_PLAYTIME; transition: TRANSITION_FOCUS; - after: "item_focused"; - } - program { - name: "item_focused"; - action: SIGNAL_EMIT SIG_ITEM_FOCUSED SIG_SOURCE_EDC; } program { name: "go_passive"; @@ -1556,11 +1546,6 @@ group { name: "focus,in,anim,2"; action: STATE_SET "selected" 0.0; target: "defaultbg_text"; - after: "item_focused"; - } - program { - name: "item_focused"; - action: SIGNAL_EMIT SIG_ITEM_FOCUSED SIG_SOURCE_EDC; } program { name: "go_passive"; diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 857d2a0..f62d21e 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -188,6 +188,10 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, lmgr->focused = elm_object_parent_widget_get(obj); elm_object_signal_emit(lmgr->data->menu_btn, SIG_BTN_SELECTED, SIG_SOURCE_SRC); + + if (it) + lmgr->focused_it = it; + break; default: break; @@ -243,60 +247,11 @@ static void _play_info_selected_cb(void *data, Evas_Object *obj, pops->selected_cb(pops->ops_data, obj); } -static void _item_focused_cb(void *data, Elm_Object_Item *it, - const char *emission, const char *source) -{ - struct listmgr *lmgr; - - if (!data || !it) - return; - - lmgr = data; - - 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) -{ - struct listmgr *lmgr; - - if (!data || !it) - return; - - lmgr = data; - - _add_grid_item_callback(it, lmgr); -} - -static void _unrealized_cb(int id, void *data, Evas_Object *obj, - Elm_Object_Item *it) -{ - if (!it) - return; - - _delete_grid_item_callback(it); -} - static input_handler _grid_handler = { .key_down = _key_down_cb, .mouse_move = _mouse_move_cb, .focused = _focused_cb, .selected = _grid_selected_cb, - .realized = _realized_cb, - .unrealized = _unrealized_cb }; static input_handler _handler = { @@ -550,12 +505,8 @@ 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); - + EINA_LIST_FOREACH(list, l, it) elm_gengrid_item_update(it); - _add_grid_item_callback(it, lmgr); - } } bool listmgr_update_content_item(struct listmgr *lmgr) -- 2.7.4 From 91ab3c2eb1f1b3b8521474e1a1e26bb7f1e7e095 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 2 Sep 2015 15:24:54 +0900 Subject: [PATCH 12/16] base: add button and ctxpopup to select view mode Change-Id: I8e45929ebcc5b67076f375459054e26a5c999bf4 Signed-off-by: Jehun Lim --- include/layout/movie.h | 1 - include/view/base.h | 2 + res/edc/layout/movie.edc | 41 --------- res/edc/view/base.edc | 85 ++++++++++++++++- res/edc/widgets/ctxpopup.edc | 2 +- src/layout/gallery.c | 6 +- src/layout/movie.c | 6 +- src/layout/music.c | 6 +- src/view/base.c | 211 +++++++++++++++++++++++++++++++++++-------- 9 files changed, 273 insertions(+), 87 deletions(-) diff --git a/include/layout/movie.h b/include/layout/movie.h index f6f6145..2de9449 100644 --- a/include/layout/movie.h +++ b/include/layout/movie.h @@ -27,7 +27,6 @@ /* part */ #define PART_CONTENT "part.content" #define PART_NOCONTENT "part.nocontent" -#define PART_CONTENT_INFO "part.content_info" #define PART_RECENT_CONTENT_TEXTBG "part.recent_content_textbg" #define PART_RECENT_CONTENT_THUMBNAIL "part.recent_content_thumbnail" #define PART_RECENT_CONTENT_FAVORITE "part.recent_content_favorite" diff --git a/include/view/base.h b/include/view/base.h index c5f365d..95dda2e 100644 --- a/include/view/base.h +++ b/include/view/base.h @@ -28,6 +28,8 @@ #define PART_TITLE "part.title" #define PART_MENU_AREA "part.menu_area" #define PART_THUMBNAIL_AREA "part.thumbnail_area" +#define PART_VIEW_MODE "part.view_mode" +#define PART_CONTENT_INFO "part.content_info" #define PART_ITEM_TITLE "part.item_title" #define PART_ITEM_CONTENT "part.item_content" diff --git a/res/edc/layout/movie.edc b/res/edc/layout/movie.edc index 479d8ad..3b8c598 100644 --- a/res/edc/layout/movie.edc +++ b/res/edc/layout/movie.edc @@ -52,10 +52,6 @@ group { to: "padding_thumbnail_area"; relative: 1.0 0.0; } - rel2 { - to: "padding_content_info"; - relative: 1.0 0.0; - } } } part { @@ -74,42 +70,5 @@ group { color: COLOR_TEXT_NORMAL; } } - part { - name: "padding_content_info"; - type: SPACER; - scale: 1; - description { - state: "default" 0.0; - rel1.to: PART_CONTENT_INFO; - rel2 { - to: PART_CONTENT_INFO; - relative: 1.0 0.0; - } - min: 0 16; - align: 0.5 1.0; - fixed: 0 1; - } - } - part { - name: PART_CONTENT_INFO; - type: TEXT; - scale: 1; - description { - state: "default" 0.0; - rel1 { - to: "padding_thumbnail_area"; - relative: 1.0 1.0; - } - text { - font: FONT_LIGHT; - size: 28; - align: 0.0 0.5; - } - min: 0 64; - align: 0.5 1.0; - color: COLOR_TEXT_INDEX; - fixed: 0 1; - } - } } } diff --git a/res/edc/view/base.edc b/res/edc/view/base.edc index b95e599..52bdbcf 100644 --- a/res/edc/view/base.edc +++ b/res/edc/view/base.edc @@ -133,11 +133,94 @@ group { relative: 0.0 1.0; } rel2.to: "padding_thumbnail_area"; - min: 0 784; + min: 0 720; align: 0.5 0.0; fixed: 0 1; } } + part { + name: "bottom_area"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_THUMBNAIL_AREA; + relative: 0.0 1.0; + } + rel2.to: PART_THUMBNAIL_AREA; + min: 0 64; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: "padding_view_mode"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bottom_area"; + rel2 { + to: "bottom_area"; + relative: 0.0 1.0; + } + min: 62 0; + align: 0.0 0.5; + fixed: 1 0; + } + } + part { + name: PART_VIEW_MODE; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_view_mode"; + relative: 1.0 0.0; + } + rel2.to: "padding_view_mode"; + min: 218 0; + align: 0.0 0.5; + fixed: 1 0; + } + } + part { + name: "padding_content_info"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_VIEW_MODE; + relative: 1.0 0.0; + } + rel2.to: PART_VIEW_MODE; + min: 26 0; + align: 0.0 0.5; + fixed: 1 0; + } + } + part { + name: PART_CONTENT_INFO; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_content_info"; + relative: 1.0 0.0; + } + rel2.to: "bottom_area"; + text { + font: FONT_LIGHT; + size: 28; + align: 0.0 0.5; + } + color: COLOR_TEXT_INDEX; + } + } /* CURTAIN */ part { diff --git a/res/edc/widgets/ctxpopup.edc b/res/edc/widgets/ctxpopup.edc index 188d688..616b6d4 100644 --- a/res/edc/widgets/ctxpopup.edc +++ b/res/edc/widgets/ctxpopup.edc @@ -24,7 +24,7 @@ group { scale: 1; description { state: "default" 0.0; - min: 220 226; + min: 220 0; color: COLOR_ITEM_BG; } } diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 22e32e2..3a535e8 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -267,15 +267,17 @@ static void _update_content_info(struct _priv *priv) snprintf(buf, sizeof(buf), "%d Photos, %d Videos", photo, video); - elm_object_part_text_set(priv->layout, PART_CONTENT_INFO, buf); + elm_object_part_text_set(priv->base, PART_CONTENT_INFO, buf); } static void _update_content_list(struct _priv *priv) { Eina_List *list; - if (priv->media_list) + if (priv->media_list) { + _update_content_info(priv); return; + } list = mediadata_get_list(priv->md, E_LIST_DATE); if (!list) { diff --git a/src/layout/movie.c b/src/layout/movie.c index 4639e8a..38506ae 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -469,15 +469,17 @@ static void _update_content_info(struct _priv *priv) snprintf(buf, sizeof(buf), "%d Movies", count); - elm_object_part_text_set(priv->layout, PART_CONTENT_INFO, buf); + elm_object_part_text_set(priv->base, PART_CONTENT_INFO, buf); } static void _update_content_list(struct _priv *priv) { Eina_List *list; - if (priv->media_list) + if (priv->media_list) { + _update_content_info(priv); return; + } list = mediadata_get_list(priv->md, E_LIST_NAME); if (!list) { diff --git a/src/layout/music.c b/src/layout/music.c index 1ff80c0..1b61627 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -402,15 +402,17 @@ static void _update_content_info(struct _priv *priv) snprintf(buf, sizeof(buf), "%d Songs", count); - elm_object_part_text_set(priv->layout, PART_CONTENT_INFO, buf); + elm_object_part_text_set(priv->base, PART_CONTENT_INFO, buf); } static void _update_content_list(struct _priv *priv) { Eina_List *list; - if (priv->media_list) + if (priv->media_list) { + _update_content_info(priv); return; + } list = mediadata_get_list(priv->md, E_LIST_NAME); if (!list) { diff --git a/src/view/base.c b/src/view/base.c index 4db00f3..7c928a3 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -28,6 +28,7 @@ #include "define.h" #include "layout.h" #include "view.h" +#include "util/ctxpopup.h" #include "util/util.h" #define TITLE_TEXT "Media Hub" @@ -41,6 +42,13 @@ #define TIME_TOAST_FAVORITE 5.0 +#define ARRAY_SIZE(arr) (sizeof(arr)) / (sizeof((arr)[0])) + +enum _object_type { + BASE_MENU_BTN = 0, + BASE_VIEW_BTN +}; + enum _layout_type { E_LAYOUT_MOVIE = 0, E_LAYOUT_GALLERY, @@ -51,40 +59,76 @@ enum _layout_type { struct _priv { Evas_Object *win; Evas_Object *base; - Evas_Object *btn[E_LAYOUT_MAX]; - Evas_Object *notify; + Evas_Object *menu_btn[E_LAYOUT_MAX]; + Evas_Object *view_btn; Evas_Object *focused_btn; + Evas_Object *notify; + + struct ctxpopup *cpopup; + layoutmgr *lmgr; Eina_List *favorite_list; app_media *recent_item; int current_layout; + int view_mode; +}; + +const char *view_mode_movie[] = { + "Name", + "Genre", + "Date", + "Folder" +}; + +const char *view_mode_gallery[] = { + "Event", + "Place", + "Video", + "Folder" +}; + +const char *view_mode_music[] = { + "Song", + "Album", + "Artist", + "Genre", + "Folder" }; struct _menu_item { const char *name; const char *layout_id; layout_class *(*func_get_lclass)(void); + + const char **text_view_mode; + int text_size; }; static struct _menu_item g_menu_item[E_LAYOUT_MAX] = { [E_LAYOUT_MOVIE] = { "Movie", LAYOUT_MOVIE, - layout_movie_get_lclass + layout_movie_get_lclass, + view_mode_movie, + ARRAY_SIZE(view_mode_movie) }, [E_LAYOUT_GALLERY] = { "Gallery", LAYOUT_GALLERY, - layout_gallery_get_lclass + layout_gallery_get_lclass, + view_mode_gallery, + ARRAY_SIZE(view_mode_gallery) }, [E_LAYOUT_MUSIC] = { "Music", LAYOUT_MUSIC, - layout_music_get_lclass + layout_music_get_lclass, + view_mode_music, + ARRAY_SIZE(view_mode_music) } }; @@ -94,31 +138,74 @@ static void _set_current_layout(struct _priv *priv, int layout) g_menu_item[priv->current_layout].layout_id); layoutmgr_show_layout(priv->lmgr, g_menu_item[layout].layout_id); + elm_object_text_set(priv->view_btn, + g_menu_item[layout].text_view_mode[priv->view_mode]); + if (priv->focused_btn) elm_object_signal_emit(priv->focused_btn, SIG_BTN_UNSELECTED, SIG_SOURCE_SRC); - priv->focused_btn = priv->btn[layout]; + priv->focused_btn = priv->menu_btn[layout]; priv->current_layout = layout; } +static void _update_layout(struct _priv *priv, Evas_Object *obj) +{ + int i; + + for (i = 0; i < E_LAYOUT_MAX; i++) { + if (priv->menu_btn[i] == obj) + break; + } + + if (i == E_LAYOUT_MAX) + return; + + layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id, + UPDATE_FOCUS_STATE, NULL); + + if (priv->focused_btn == obj) + return; + + _set_current_layout(priv, i); + + layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id, + UPDATE_CONTENT, NULL); +} + 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); - else if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) - ui_app_exit(); + switch (id) { + case BASE_MENU_BTN: + if (!strcmp(ev->keyname, KEY_ENTER) || + !strcmp(ev->keyname, KEY_ENTER_REMOTE)) + elm_object_focus_next(obj, ELM_FOCUS_DOWN); + else if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) + ui_app_exit(); + + break; + case BASE_VIEW_BTN: + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) + ui_app_exit(); + + break; + default: + break; + } } static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { + if (!obj) + return; + if (!elm_object_focus_get(obj)) elm_object_focus_set(obj, EINA_TRUE); } @@ -127,7 +214,6 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *it) { struct _priv *priv; - int i; if (!data) { _ERR("failed to get data"); @@ -136,29 +222,59 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, priv = data; - for (i = 0; i < E_LAYOUT_MAX; i++) { - if (priv->btn[i] == obj) - break; + switch (id) { + case BASE_MENU_BTN: + _update_layout(priv, obj); + break; + default: + break; } +} - if (i == E_LAYOUT_MAX) +static void _view_btn_clicked(struct _priv *priv) +{ + struct ctxpopup *cpopup; + int x, y, w, h; + + cpopup = ctxpopup_create(priv->base, STYLE_CTXPOPUP_VIEW_MODE, + STYLE_BTN_VIEW_OPTION, + g_menu_item[priv->current_layout].text_view_mode, + g_menu_item[priv->current_layout].text_size); + if (!cpopup) { + _ERR("failed to create ctxpopup"); return; + } - layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id, - UPDATE_FOCUS_STATE, NULL); + evas_object_geometry_get(priv->view_btn, &x, &y, &w, &h); + ctxpopup_show(cpopup, x + (w / 2), y); - if (priv->focused_btn == obj) + priv->cpopup = cpopup; +} + +static void _clicked_cb(int id, void *data, Evas_Object *obj) +{ + struct _priv *priv; + + if (!data) { + _ERR("failed to get data"); return; + } - _set_current_layout(priv, i); + priv = data; - layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id, - UPDATE_CONTENT, NULL); + switch (id) { + case BASE_VIEW_BTN: + _view_btn_clicked(priv); + break; + default: + break; + } } static input_handler handler = { .key_down = _key_down_cb, .mouse_move = _mouse_move_cb, + .clicked = _clicked_cb, .focused = _focused_cb }; @@ -437,32 +553,50 @@ static bool _draw_menu_btn(struct _priv *priv) evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); for (i = 0; i < E_LAYOUT_MAX; i++) { - btn = elm_button_add(box); + btn = util_add_button(box, STYLE_BTN_MENU, g_menu_item[i].name); if (!btn) { - _ERR("failed to create button object"); + _ERR("failed to add button object"); + evas_object_del(box); return false; } - elm_object_style_set(btn, STYLE_BTN_MENU); - elm_object_text_set(btn, g_menu_item[i].name); - elm_box_pack_end(box, btn); evas_object_show(btn); - inputmgr_add_callback(btn, 0, &handler, priv); + inputmgr_add_callback(btn, BASE_MENU_BTN, &handler, priv); - priv->btn[i] = btn; + priv->menu_btn[i] = btn; } evas_object_show(box); elm_object_part_content_set(priv->base, PART_MENU_AREA, box); - elm_object_focus_next_object_set(priv->btn[E_LAYOUT_MAX - 1], - priv->btn[0], ELM_FOCUS_RIGHT); - elm_object_focus_next_object_set(priv->btn[0], - priv->btn[E_LAYOUT_MAX - 1], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->menu_btn[E_LAYOUT_MAX - 1], + priv->menu_btn[0], ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(priv->menu_btn[0], + priv->menu_btn[E_LAYOUT_MAX - 1], + ELM_FOCUS_LEFT); + + return true; +} + +static bool _draw_view_mode_btn(struct _priv *priv) +{ + Evas_Object *btn; + + btn = util_add_button(priv->base, STYLE_BTN_VIEW_MODE, NULL); + if (!btn) { + _ERR("failed to add button object"); + return false; + } + + inputmgr_add_callback(btn, BASE_VIEW_BTN, &handler, priv); + + elm_object_part_content_set(priv->base, PART_VIEW_MODE, btn); + + priv->view_btn = btn; return true; } @@ -478,6 +612,9 @@ static bool _draw_items(struct _priv *priv) if (!_draw_menu_btn(priv)) return false; + if (!_draw_view_mode_btn(priv)) + return false; + return true; } @@ -559,13 +696,13 @@ static Evas_Object *_create(Evas_Object *win, void *data) lmgr = layoutmgr_create(base); for (i = 0; i < E_LAYOUT_MAX; i++) layoutmgr_add_layout(lmgr, g_menu_item[i].func_get_lclass(), - priv->btn[i]); + priv->menu_btn[i]); priv->lmgr = lmgr; viewmgr_set_view_data(VIEW_BASE, priv); - elm_object_focus_set(priv->btn[0], EINA_TRUE); + elm_object_focus_set(priv->menu_btn[0], EINA_TRUE); return base; } @@ -694,7 +831,7 @@ static void _destroy(void *view_data) priv = view_data; for (i = 0; i < E_LAYOUT_MAX; i++) - inputmgr_remove_callback(priv->btn[i], &handler); + inputmgr_remove_callback(priv->menu_btn[i], &handler); layoutmgr_remove_layout(priv->lmgr, LAYOUT_MOVIE); layoutmgr_remove_layout(priv->lmgr, LAYOUT_GALLERY); -- 2.7.4 From 55b4f7546852f21f5ca7e74baa5b92edd0144502 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 2 Sep 2015 15:31:00 +0900 Subject: [PATCH 13/16] fix libpng warning Change-Id: Iacea8fc6ce028530a0159c2b81ec213041d267a5 Signed-off-by: Jehun Lim --- res/edc/images/btn_option_arrow_dis.png | Bin 2930 -> 186 bytes res/edc/images/btn_option_arrow_foc_up.png | Bin 2911 -> 170 bytes res/edc/images/btn_option_arrow_nor.png | Bin 2942 -> 196 bytes res/edc/images/btn_option_arrow_sel.png | Bin 2967 -> 251 bytes res/edc/images/btn_view_contr_rotate_foc.png | Bin 3938 -> 951 bytes res/edc/images/btn_view_contr_rotate_nor.png | Bin 4008 -> 1075 bytes res/edc/images/btn_view_contr_zoom_foc.png | Bin 1872 -> 777 bytes res/edc/images/btn_view_contr_zoom_nor.png | Bin 2022 -> 890 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res/edc/images/btn_option_arrow_dis.png b/res/edc/images/btn_option_arrow_dis.png index dc339370ef5907537c0eab4781ce2db4f8be5f31..6b6aee208aeac588408b356b97d07ad79498c6ec 100644 GIT binary patch delta 169 zcmV;a09OC<7Pvh*1^a4TeFFl1nZve_6685nUX zRAvxC;)yUQV^=7^ppNDcbp`=Ug)9t47%paFFoFdjLQ0o`8zM_kaWm*boj;mq2B|^- XmKF%L+@sjr00000NkvXXu0mjfV^KVv literal 2930 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 diff --git a/res/edc/images/btn_option_arrow_foc_up.png b/res/edc/images/btn_option_arrow_foc_up.png index f101da0fbce0ec1cba857ee9b0b0eb24cd26682e..d1836c26aff906ab41ad93e375545ddcbed9aeb6 100644 GIT binary patch delta 153 zcmV;K0A~N+7ODY|8Gi%-004#?_TT^j0C7n~K~y-)?bERpKrj%1;UpD>0SuBcSjQp^ z;Cas!*@O*PAWeQn3QrDCnZkeF-PfK*ean1wKgDgMm@F00000NkvXX Hu0mjfvduy^ literal 2911 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 JPDHLkV1oPSV?F=? diff --git a/res/edc/images/btn_option_arrow_nor.png b/res/edc/images/btn_option_arrow_nor.png index 17bc2c6fa3729e6cd4a0643fecb1c3b40535f60e..3b2d1ac13211b0e9cdd780e971a827adeaef9d97 100644 GIT binary patch delta 179 zcmV;k08Ib>7Q_LN8Gi%-004#?_TT^j0Ea1mMdkni literal 2942 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 diff --git a/res/edc/images/btn_option_arrow_sel.png b/res/edc/images/btn_option_arrow_sel.png index 21b5ffa15d8b2c4c48f9c431d4438e80777bfbe1..1ffe296a16dff515a22e960e26ff29a8b2f25d63 100644 GIT binary patch delta 223 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 Hu0mjfa&U?A diff --git a/res/edc/images/btn_view_contr_rotate_foc.png b/res/edc/images/btn_view_contr_rotate_foc.png index 343f481e0184548358754876b8c0849e898334d7..6382885b5561fcd1d01ae622cc0c2bebfc6f236e 100644 GIT binary patch literal 951 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 hul@fANXw?OJ zv)bLt&2JE9pEucOsbYzCXAalRrhc<$MHAW2Y~IW0S@!?1ddURO#|qg^C(f~Lob>hy z!}6OR-q%fiU(ClTltRo0)sO__N_loJd;{n&2BVTJ7uzbVP5o&rS~HarEc2k<(BUt zr`*50BKcp$kIw1VPl~SmJyEH%TvR{)am06R)h(Ou9AoeDT+(i|U`l%7y7$XPG>q%# z7+7wYvC(F^O(W-17KzhJ=E~-bzm;U77On2BJ&<SmELl8fR&t&zQY~Ui^Rvijetfq}hBMZGZ7b>`iBTt*B}Bxg)!-&3Of zN%3M`{-6KLSkiY2MY5kUG)ONin0D~X9n)pAR;o^&#Ik(K1TWpQY^`n+3nXrM7BLA= zx+yy6anzE2^`0bWCSfy!NymTO>B&jg-Z1@+#r5;4`Ww#v*($jC{_>FGwi2!XyV^u+ zGeai%sa{>y`E38BnEv@S=Z@8EJ##qnQ)bfM%0-na+}stXmGlf0-u#{T;q9HLx}Seu zk)Ckj2$NmFnX?<-pS5yxiOA;{&fMg0NjKWE+wF4|OZ;2^HBa{xJ2anIvAcD;IG_Ep$0sB?V{dgEpSBMxa<6^# r{ASmbNlHtXcxY+{d6C2X%K1b-IrwgTe~DWM4f8UO7K literal 4008 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 diff --git a/res/edc/images/btn_view_contr_zoom_foc.png b/res/edc/images/btn_view_contr_zoom_foc.png index da4574045e22e7dfbf434bf86c4f616425473c30..0a893a1c0f8517b7ddd73ec1ba3fee4fe957f473 100644 GIT binary patch literal 777 zcmeAS@N?(olHy`uVBq!ia0vp^ML;}>g9S($PY5evU|_o7>EaktaqI1Ee{YdOnd2YN zr|gb1Pf=X&RIew?<47OKN&kzV?Oufr))3OO$<|d1zZ+^6J|%NqOxP zGMJaX9(X<7WU;!`^%+`|_GL!Tu3ByWYwGGr1@5hEvFEa;vrTQd|MQAq-b*WMhAojP zU4f^jNTznV-ePzY&@XLygp0v9E4^;-F*XKmo}*ndNum}hjZ5BJa&pTst*$h1*7?O{ zk?`rxXSJVPI>$Tau-6$GUf3!8hv8YWbJz=p^Xzv2B`0cSG}o*RuMnRa_;>)mL|&@GkzqyH=oEkNG!qZvC6%yZ%nhQ(k@gti{Co zZ7SyHZch5cRI@}%J*dNKuJG*Bs$S}5)2*+pyu=o@aHgX8`VB|!&8%0uk-W0p{cP*Z zx2v!1pK7u=vp3tvTtzk`dUn+1Tk-R|L-$^`-TF0R_r@B(xF;(vaaEgkvpqYcGiy5c z=8PDfJeV6VL V*!X&W1Tcv+c)I$ztaD0e0szSlZr=a^ literal 1872 zcmbVN3rrJt7_Z`M1{B2?KI-j2lwu!ueOF3tdo5IHVZ4P*ExiLeXs=ukXce70jUckf zOYIbOA}%VTqN30taWfH7gE-^DL+7UGbW9@=6%4W~0!~9*vdi6l|NnR2?|c1!UoJOX z7wj={_Cy+u=Aj8eA}C2vPvL}d)Z5|M*G~y=QWZx=;z?wdp1^2w6i>tejY*%3MPPc= zo_+-jq|w}xj8So9oHkTqz)dW@%Z6n$StvA(7AUh>^oCT71QM}iqge_*bJl}^5tV|m zd@V<7QDP~^kTnDrxkeXdSd(fHqo6DZ2((Ek2PTZv12$8d*($L~!2!P#YVA_9L14gy zOqGJ~l8V!Y14^9006vS$G;kmY5C~Whk1r5FivgGe!E6q73z!g3!WT$jAuxD>R5Suj zl0+ct!C2Hz3Z{^xMZ#uhWo5ClxGbDVWqE#35Sn@p~{2CS`Q1ol3S5v{FJ zb_>Riz^r%%VW7?<$!7>m_3qPwT!vIOk}$$Z9g02;!3`NE%uH$!DM)=`p+;1K2suhV zmk)D9h)BhQAQ6uvSF2Qfo?H!yg<{2!kCCuEj)=oma1od*7D14TuaL{t3ZaNE7r`Pm zA5sosHD)WRHyf~_xJD}OAXfQFtVBs*dJ-q1a6D~@0pTe)iCa@}3!sb?0E=RcW)#n| z`n!(jU9|{C7&9?cP2eVApuZC12=QU6M2<)$f|U?eEd+@bA_2k^t6)Tl$VFT}IEY36 zPtVv?GHe$){zaA{6~#c;a+vzmW_WloGc_>;H5wb{o^_)pZi5DqN7-6C_h?hS2r z&zf`Wht<+czwM~^-AoT%;=I1S$xY^WhfMw{$mwXgmR8xE;_DeCM!>0_pXH4CNQ?%j zxRf7@Q3V6a_X6<+M-^-cS^ALxrVc2P#e@T{=!~uom{U^n^6uo0vaZmY6YY`feX7n` zs?;S#%YL8#$`Mn!Xr>khXF7iNGvxR6#nhCCGM*KGXKD&?Ydk=Nx1_bzw`wdtj3ONh ztTC~V?q9^a$X)xBe%gNY(=$3Apthu{u`r}D|?yd`Zq^srW(2gJL zSX&sUemxNq-1B`x=v4dOxS+z#7iIQO$_z`Ge2bQ pfAZ8tWfxIL6d$s8x9saNvuLz@;r4`PMX&20r%~yUO2z6;{{RGYtpfl6 diff --git a/res/edc/images/btn_view_contr_zoom_nor.png b/res/edc/images/btn_view_contr_zoom_nor.png index e5d69d496ad8a37772c8db09c9c2f7ed7f8262f7..11457eea69b5374f24a091f45d20ee9d7445cf90 100644 GIT binary patch literal 890 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 -- 2.7.4 From 2593f71d1089f11c8c4c437f177654a762d54cd9 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 1 Sep 2015 19:07:55 +0900 Subject: [PATCH 14/16] listmgr: add focus policy for view button in base view Change-Id: I9a04de166c414964b17c606a8a6350b0df1035a7 Signed-off-by: Jehun Lim --- include/layout.h | 6 ++ include/util/listmgr.h | 1 + src/layout/gallery.c | 9 ++- src/layout/movie.c | 9 ++- src/layout/music.c | 9 ++- src/util/listmgr.c | 195 ++++++++++++++++++++++++++++++++++++------------- src/view/base.c | 11 ++- 7 files changed, 185 insertions(+), 55 deletions(-) diff --git a/include/layout.h b/include/layout.h index d20ddee..d3520e6 100644 --- a/include/layout.h +++ b/include/layout.h @@ -26,4 +26,10 @@ layout_class *layout_gallery_get_lclass(void); /* music */ layout_class *layout_music_get_lclass(void); +/* layout data */ +struct layout_data { + Evas_Object *top; + Evas_Object *bottom; +}; + #endif /* __AIR_MEDIAHUB_LAYOUT_H__ */ diff --git a/include/util/listmgr.h b/include/util/listmgr.h index 1999de3..f90bb0b 100644 --- a/include/util/listmgr.h +++ b/include/util/listmgr.h @@ -38,6 +38,7 @@ struct grid_ops { struct listmgr_data { Evas_Object *menu_btn; + Evas_Object *view_btn; int grid_item_x; int grid_item_y; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 3a535e8..70efdf7 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -24,6 +24,7 @@ #include #include "define.h" +#include "layout.h" #include "view.h" #include "data/mediadata.h" #include "util/listmgr.h" @@ -44,6 +45,7 @@ struct _priv { Evas_Object *base; Evas_Object *layout; Evas_Object *menu_btn; + Evas_Object *view_btn; layoutmgr *lmgr; @@ -226,6 +228,7 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) goto err; data->menu_btn = priv->menu_btn; + data->view_btn = priv->view_btn; data->grid_item_x = GRID_ITEM_X; data->grid_item_y = GRID_ITEM_Y; @@ -296,6 +299,7 @@ static void _update_content_list(struct _priv *priv) static bool _create(layoutmgr *lmgr, void *data) { + struct layout_data *ld; struct listmgr *listmgr; struct listmgr_data *ldata; struct mediadata *md; @@ -312,13 +316,16 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } + ld = data; + priv = calloc(1, sizeof(*priv)); if (!priv) { _ERR("failed to allocate priv"); return false; } - priv->menu_btn = (Evas_Object *)data; + priv->menu_btn = ld->top; + priv->view_btn = ld->bottom; base = layoutmgr_get_base(lmgr); if (!base) { diff --git a/src/layout/movie.c b/src/layout/movie.c index 38506ae..41d3bdf 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -25,6 +25,7 @@ #include #include "define.h" +#include "layout.h" #include "view.h" #include "data/mediadata.h" #include "util/listmgr.h" @@ -48,6 +49,7 @@ struct _priv { Evas_Object *layout; Evas_Object *box; Evas_Object *menu_btn; + Evas_Object *view_btn; layoutmgr *lmgr; @@ -418,6 +420,7 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) goto err; data->menu_btn = priv->menu_btn; + data->view_btn = priv->view_btn; data->grid_item_x = GRID_ITEM_X; data->grid_item_y = GRID_ITEM_Y; @@ -554,6 +557,7 @@ static void _update_recent_item(struct _priv *priv, const char *id) static bool _create(layoutmgr *lmgr, void *data) { + struct layout_data *ld; struct listmgr *listmgr; struct listmgr_data *ldata; struct mediadata *md; @@ -570,13 +574,16 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } + ld = data; + priv = calloc(1, sizeof(*priv)); if (!priv) { _ERR("failed to allocate priv"); return false; } - priv->menu_btn = (Evas_Object *)data; + priv->menu_btn = ld->top; + priv->view_btn = ld->bottom; base = layoutmgr_get_base(lmgr); if (!base) { diff --git a/src/layout/music.c b/src/layout/music.c index 1b61627..48161ae 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -25,6 +25,7 @@ #include #include "define.h" +#include "layout.h" #include "view.h" #include "data/mediadata.h" #include "util/listmgr.h" @@ -46,6 +47,7 @@ struct _priv { Evas_Object *base; Evas_Object *layout; Evas_Object *menu_btn; + Evas_Object *view_btn; layoutmgr *lmgr; @@ -351,6 +353,7 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) goto err; data->menu_btn = priv->menu_btn; + data->view_btn = priv->view_btn; data->grid_item_x = GRID_ITEM_X; data->grid_item_y = GRID_ITEM_Y; @@ -484,6 +487,7 @@ static void _update_playing_item(struct _priv *priv, const char *id) static bool _create(layoutmgr *lmgr, void *data) { + struct layout_data *ld; struct listmgr *listmgr; struct listmgr_data *ldata; struct mediadata *md; @@ -500,13 +504,16 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } + ld = data; + priv = calloc(1, sizeof(*priv)); if (!priv) { _ERR("failed to allocate priv"); return false; } - priv->menu_btn = (Evas_Object *)data; + priv->menu_btn = ld->top; + priv->view_btn = ld->bottom; base = layoutmgr_get_base(lmgr); if (!base) { diff --git a/src/util/listmgr.c b/src/util/listmgr.c index f62d21e..2f0cda0 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -54,6 +54,59 @@ struct listmgr { Eina_Bool focus_state; }; +static void _index_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) +{ + Evas_Object *grid; + Elm_Object_Item *it; + Evas_Event_Key_Down *ev; + struct listmgr *lmgr; + + if (!data || !obj || !ei) + return; + + lmgr = data; + ev = ei; + + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + elm_object_focus_next(obj, ELM_FOCUS_UP); + } else if (!strcmp(ev->keyname, KEY_DOWN)) { + if (lmgr->play_info == lmgr->focused) + return; + + grid = elm_object_part_content_get(lmgr->focused, + PART_ITEM_CONTENT); + it = elm_gengrid_first_item_get(grid); + if (it) + elm_object_item_focus_set(it, EINA_TRUE); + } +} + +static void _view_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) +{ + Evas_Object *play_info; + Evas_Event_Key_Down *ev; + struct listmgr *lmgr; + + if (!data || !ei) + return; + + lmgr = data; + ev = ei; + + if (!evas_object_visible_get(lmgr->base)) + return; + + if (!strcmp(ev->keyname, KEY_UP)) { + if (lmgr->focused == lmgr->play_info) { + play_info = elm_object_part_content_get(lmgr->focused, + PART_ITEM_CONTENT); + elm_object_focus_set(play_info, EINA_TRUE); + } else + elm_object_item_focus_set(lmgr->focused_it, EINA_TRUE); + } +} + static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { @@ -66,25 +119,6 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, lmgr = data; 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); - } else if (!strcmp(ev->keyname, KEY_DOWN)) { - Evas_Object *grid; - Elm_Object_Item *it; - - if (lmgr->play_info == lmgr->focused) - break; - - grid = elm_object_part_content_get(lmgr->focused, - PART_ITEM_CONTENT); - it = elm_gengrid_first_item_get(grid); - if (it) - elm_object_item_focus_set(it, EINA_TRUE); - } - - break; case LISTMGR_PLAY_INFO: case LISTMGR_GRID: if (!strcmp(ev->keyname, KEY_BACK) || @@ -251,7 +285,7 @@ static input_handler _grid_handler = { .key_down = _key_down_cb, .mouse_move = _mouse_move_cb, .focused = _focused_cb, - .selected = _grid_selected_cb, + .selected = _grid_selected_cb }; static input_handler _handler = { @@ -261,6 +295,12 @@ static input_handler _handler = { .focused = _focused_cb }; +static input_handler _idx_handler = { + .mouse_move = _mouse_move_cb, + .clicked = _clicked_cb, + .focused = _focused_cb +}; + static Evas_Object *_get_box_first_item(Evas_Object *box) { Eina_List *list; @@ -310,7 +350,7 @@ static bool _draw_play_info(struct listmgr *lmgr) index = elm_object_part_content_get(ly, PART_ITEM_TITLE); - inputmgr_add_callback(index, LISTMGR_INDEX, &_handler, lmgr); + inputmgr_add_callback(index, LISTMGR_INDEX, &_idx_handler, lmgr); elm_object_focus_next_object_set(index, lmgr->data->menu_btn, ELM_FOCUS_UP); @@ -327,51 +367,51 @@ static bool _draw_play_info(struct listmgr *lmgr) return true; } -static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) +static Evas_Object *_add_list_item_button(struct listmgr *lmgr, + Evas_Object *base, struct group_info *gi) { - Evas_Object *ly, *btn, *grid; - struct listmgr_data *data; - int width; + Evas_Object *btn; char buf[128]; - data = lmgr->data; - - ly = elm_layout_add(lmgr->box); - if (!ly) { - _ERR("failed to create layout object"); - return NULL; - } - - elm_layout_file_set(ly, EDJEFILE, GRP_LIST_ITEM); + snprintf(buf, sizeof(buf), " %s ", gi->name); - btn = elm_button_add(ly); + btn = util_add_button(base, STYLE_BTN_INDEX, buf); if (!btn) { - _ERR("failed to create button object"); - evas_object_del(ly); + _ERR("failed to add button object"); return NULL; } - elm_object_style_set(btn, STYLE_BTN_INDEX); - - 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); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN); + + inputmgr_add_callback(btn, LISTMGR_INDEX, &_idx_handler, lmgr); + evas_object_event_callback_priority_add(btn, EVAS_CALLBACK_KEY_DOWN, + EVAS_CALLBACK_PRIORITY_AFTER, + _index_key_down_cb, lmgr); + + return btn; +} - inputmgr_add_callback(btn, LISTMGR_INDEX, &_handler, lmgr); +static Evas_Object *_add_list_item_grid(struct listmgr *lmgr, + Evas_Object *base, struct group_info *gi) +{ + Evas_Object *grid; + struct listmgr_data *data; + int width; - grid = util_add_gengrid(ly, data->grid_item_x, + data = lmgr->data; + + grid = util_add_gengrid(base, data->grid_item_x, data->grid_item_y, EINA_TRUE); if (!grid) { - _ERR("failed to create gengrid object"); - evas_object_del(ly); + _ERR("failed to add gengrid object"); return NULL; } if (!gridmgr_add_grid(lmgr->gmgr, gi->name, grid, data->gops->gclass)) { _ERR("failed to add grid"); - evas_object_del(ly); + evas_object_del(grid); return NULL; } @@ -381,10 +421,41 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) evas_object_size_hint_min_set(grid, width, data->grid_num_item * data->grid_item_y); - elm_object_focus_next_object_set(grid, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(grid, data->view_btn, ELM_FOCUS_DOWN); inputmgr_add_callback(grid, LISTMGR_GRID, &_grid_handler, lmgr); + return grid; +} + +static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) +{ + Evas_Object *ly, *btn, *grid; + + ly = elm_layout_add(lmgr->box); + if (!ly) { + _ERR("failed to create layout object"); + return NULL; + } + + elm_layout_file_set(ly, EDJEFILE, GRP_LIST_ITEM); + + btn = _add_list_item_button(lmgr, ly, gi); + if (!btn) { + _ERR("failed to add button"); + evas_object_del(ly); + return NULL; + } + + grid = _add_list_item_grid(lmgr, ly, gi); + if (!grid) { + _ERR("failed to add grid"); + evas_object_del(ly); + return NULL; + } + + elm_object_focus_next_object_set(grid, btn, ELM_FOCUS_UP); + elm_object_part_content_set(ly, PART_ITEM_TITLE, btn); elm_object_part_content_set(ly, PART_ITEM_CONTENT, grid); @@ -509,6 +580,28 @@ void _update_grid_realized_items(struct listmgr *lmgr, Eina_List *list) elm_gengrid_item_update(it); } +static void _set_callback_view_btn(struct listmgr *lmgr) +{ + struct listmgr_data *data; + + data = lmgr->data; + + /* NOTE: focus problem handling + * When UP key is pressed on view button, + * focus is set to content object in key_down callback function. + * After grid object gets focus, UP key down event is handled again + * and focus is moved to index button. + * To fix this problem, we delay executing key_down callback function + * for view button by setting event priority value. + */ + elm_object_focus_next_object_set(data->view_btn, data->view_btn, + ELM_FOCUS_UP); + evas_object_event_callback_priority_add(data->view_btn, + EVAS_CALLBACK_KEY_DOWN, + EVAS_CALLBACK_PRIORITY_AFTER, _view_key_down_cb, + lmgr); +} + bool listmgr_update_content_item(struct listmgr *lmgr) { Eina_List *box_item, *grid_realized; @@ -670,6 +763,8 @@ bool listmgr_draw_list_area(struct listmgr *lmgr) elm_object_focus_allow_set(scr, EINA_FALSE); + _set_callback_view_btn(lmgr); + return true; } @@ -721,7 +816,7 @@ void listmgr_destroy(struct listmgr *lmgr) content = elm_object_part_content_get(lmgr->play_info, PART_ITEM_CONTENT); - inputmgr_remove_callback(btn, &_handler); + inputmgr_remove_callback(btn, &_idx_handler); inputmgr_remove_callback(content, &_handler); elm_object_signal_callback_del(content, SIG_ITEM_SELECTED, @@ -736,7 +831,7 @@ void listmgr_destroy(struct listmgr *lmgr) 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(btn, &_idx_handler); inputmgr_remove_callback(grid, &_grid_handler); } diff --git a/src/view/base.c b/src/view/base.c index 7c928a3..39d8d3a 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -596,6 +596,8 @@ static bool _draw_view_mode_btn(struct _priv *priv) elm_object_part_content_set(priv->base, PART_VIEW_MODE, btn); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT); + priv->view_btn = btn; return true; @@ -655,6 +657,7 @@ static void _show_toast_favorite(struct _priv *priv, const char *id) static Evas_Object *_create(Evas_Object *win, void *data) { + struct layout_data ldata; struct _priv *priv; Evas_Object *base; layoutmgr *lmgr; @@ -694,9 +697,13 @@ static Evas_Object *_create(Evas_Object *win, void *data) } lmgr = layoutmgr_create(base); - for (i = 0; i < E_LAYOUT_MAX; i++) + for (i = 0; i < E_LAYOUT_MAX; i++) { + ldata.top = priv->menu_btn[i]; + ldata.bottom = priv->view_btn; + layoutmgr_add_layout(lmgr, g_menu_item[i].func_get_lclass(), - priv->menu_btn[i]); + &ldata); + } priv->lmgr = lmgr; -- 2.7.4 From 980652cd0c3096ce73c0dbfe312ad30cedd669cb Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 3 Sep 2015 15:33:08 +0900 Subject: [PATCH 15/16] add zoom view Change-Id: I9ac6f1e9c89064bd8b25bb083be21c1f17a12c6e Signed-off-by: Minkyu Kang --- CMakeLists.txt | 1 + include/define.h | 2 + include/view.h | 3 + include/view/zoom.h | 50 +++ res/edc/images/ic_zoom_indicator_down_foc.png | Bin 0 -> 2807 bytes res/edc/images/ic_zoom_indicator_down_nor.png | Bin 0 -> 2728 bytes res/edc/images/ic_zoom_indicator_left_foc.png | Bin 0 -> 2786 bytes res/edc/images/ic_zoom_indicator_left_nor.png | Bin 0 -> 2764 bytes res/edc/images/ic_zoom_indicator_right_foc.png | Bin 0 -> 2777 bytes res/edc/images/ic_zoom_indicator_right_nor.png | Bin 0 -> 2759 bytes res/edc/images/ic_zoom_indicator_up_foc.png | Bin 0 -> 2803 bytes res/edc/images/ic_zoom_indicator_up_nor.png | Bin 0 -> 2667 bytes res/edc/mediahub.edc | 1 + res/edc/view/zoom.edc | 230 ++++++++++ res/edc/widgets/button.edc | 166 +++++++ src/main.c | 1 + src/view/viewer.c | 19 +- src/view/zoom.c | 598 +++++++++++++++++++++++++ 18 files changed, 1068 insertions(+), 3 deletions(-) create mode 100644 include/view/zoom.h create mode 100644 res/edc/images/ic_zoom_indicator_down_foc.png create mode 100644 res/edc/images/ic_zoom_indicator_down_nor.png create mode 100644 res/edc/images/ic_zoom_indicator_left_foc.png create mode 100644 res/edc/images/ic_zoom_indicator_left_nor.png create mode 100644 res/edc/images/ic_zoom_indicator_right_foc.png create mode 100644 res/edc/images/ic_zoom_indicator_right_nor.png create mode 100644 res/edc/images/ic_zoom_indicator_up_foc.png create mode 100644 res/edc/images/ic_zoom_indicator_up_nor.png create mode 100644 res/edc/view/zoom.edc create mode 100644 src/view/zoom.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 5045400..9baba92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,6 +61,7 @@ src/view/base.c src/view/viewer.c src/view/mplayer.c src/view/action_menu.c +src/view/zoom.c src/layout/movie.c src/layout/gallery.c src/layout/music.c diff --git a/include/define.h b/include/define.h index 1e702ad..a169928 100644 --- a/include/define.h +++ b/include/define.h @@ -22,6 +22,7 @@ #include "view/viewer.h" #include "view/mplayer.h" #include "view/action_menu.h" +#include "view/zoom.h" /* layouts */ #include "layout/movie.h" @@ -90,6 +91,7 @@ #define SIG_HIDE_VIEW "hide,view" #define SIG_DISMISSED "dismissed" #define SIG_TIMEOUT "timeout" +#define SIG_SCROLL "scroll" /* transition */ #define TRANSITION_FOCUS DECELERATE 0.20 diff --git a/include/view.h b/include/view.h index 755c6e8..19dca1e 100644 --- a/include/view.h +++ b/include/view.h @@ -29,6 +29,9 @@ view_class *view_mplayer_get_vclass(void); /* action menu */ view_class *view_action_menu_get_vclass(void); +/* zoom */ +view_class *view_zoom_get_vclass(void); + /* view data */ struct view_update_data { Eina_List *list; diff --git a/include/view/zoom.h b/include/view/zoom.h new file mode 100644 index 0000000..f5d7257 --- /dev/null +++ b/include/view/zoom.h @@ -0,0 +1,50 @@ +/* + * 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_ZOOM_H__ +#define __AIR_MEDIAHUB_VIEW_ZOOM_H__ + +/* view */ +#define VIEW_ZOOM "VIEW_ZOOM" + +/* group */ +#define GRP_ZOOM_VIEW "group.zoom_view" + +/* part */ +#define PART_ZOOM_CONTENT "part.zoom_content" +#define PART_ZOOM_NAVI "part.zoom_navi" + +/* source */ +#define SRC_BTN_UP "up" +#define SRC_BTN_DOWN "down" +#define SRC_BTN_LEFT "left" +#define SRC_BTN_RIGHT "right" + +/* signal */ +#define SIG_SET_FOCUS "set,focus" +#define SIG_SET_UNFOCUS "set,unfocus" + +/* image */ +#define IMAGE_ZOOM_UP_NORMAL "ic_zoom_indicator_up_nor.png" +#define IMAGE_ZOOM_UP_FOC "ic_zoom_indicator_up_foc.png" +#define IMAGE_ZOOM_DOWN_NORMAL "ic_zoom_indicator_down_nor.png" +#define IMAGE_ZOOM_DOWN_FOC "ic_zoom_indicator_down_foc.png" +#define IMAGE_ZOOM_LEFT_NORMAL "ic_zoom_indicator_left_nor.png" +#define IMAGE_ZOOM_LEFT_FOC "ic_zoom_indicator_left_foc.png" +#define IMAGE_ZOOM_RIGHT_NORMAL "ic_zoom_indicator_right_nor.png" +#define IMAGE_ZOOM_RIGHT_FOC "ic_zoom_indicator_right_foc.png" + +#endif diff --git a/res/edc/images/ic_zoom_indicator_down_foc.png b/res/edc/images/ic_zoom_indicator_down_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..797738cdcdc4f65b219602cf020801ce7b7f6218 GIT binary patch literal 2807 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/ic_zoom_indicator_down_nor.png b/res/edc/images/ic_zoom_indicator_down_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec7c1a80d11c72e90d59cfa1a80266960d0ad66 GIT binary patch literal 2728 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 QT>5wPbn|7LrA24{2lAhgh5!Hn literal 0 HcmV?d00001 diff --git a/res/edc/images/ic_zoom_indicator_left_foc.png b/res/edc/images/ic_zoom_indicator_left_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..d224bb1106fde1b80ad4e7e76f3f189d3f3e47c6 GIT binary patch literal 2786 zcmbVOdpwi-A0H}3lA@5DwVd4AW@A^D%`VPz-`pZGyD)6iHjIwk(oLLla1v>5kxKES zs8C7=jg|dY6=X;AeV&$`5;`ZTq23= zQ0@~i4McbDdNNf>P z$c+?p1$^KVBO_Q4CB}i2mVR}C7wO{iH!)xIEl|pkK_!exC=6l+is5V2eV?x6y)Koly7 z1QO{;pqUSs&l1Fl%$L&h)msu<$c<*RC_(`b_$9tr?my^9JD_b~NQwgr3AZLAU@!t2 zMIw+XM4~l}q+C0IzF}GaPt2f7W1vgL@ju0~yrrzbrRm?LuU!1yJZ!$QV}#1qaM@Dw z2LPbHfl4BHN}f)fjg9d1(!KvsY~Y_$lPcA7w@Tcm(YgVDCoyQX?eX1G&#TS$c-1v3 z8;c(4TOB5W!nE|6q?~GBwcR>tn#Ze1crYjow4RjOt)G3^A@3EuV7lQkEo^MI<1ME% zFE;S4ikh{o-X1bmIlV8?O5en-(^Ad;!;|hf6C+w={Ix$sXO4g}5PrEItB+JobF@$P z;`)aA%Z&s2Rid>P;0qcz&n#LltX*)7F1~oetJ3VB>3fgKYJQ{bZ9+*)$ZE(7X#R{EUYQY-VJsVNZfu2ceoCjW z-8EksJU<2A;MA35dtZh0C$)9? zCUu51J%edoh-x+qlS9e27Q2PNYZRB`wM|95hd!dIz#IMZF*GAos8Z^2~$LPV=SJZj+7h<&w@tf-kJ#p9t z#fuh{$Fz}`0ly$X-q6RaAx>pcJ-uI+QPsK>Lk>;n<+m%#w#w5bs@ z${vxXr}vf19{C*gce<0cv5Q&GXQF(tBaBpXsS0-Pz|Ys#m-VUOysclBzURot_m6Ul z%CvhP7tqrU?-~v0C=Rli$tE5SU`RnW_fyQXulpYC9H=5UvHJFe6 z(=EN`#{`^t?|MsliVfw&)WCw~BE{{+k%}D_gIlHdcTDCBSpA#C3A{(6ta-(=pAWWA zj~Cllq}cGB62nw0^>4kqt~%sMFZnDkYS8>-gSJnvcqDD_aH{5=o)J61HyZ`YS?)tuS zzj#;Dy`>LpU7q_Lin@~=Flr}$oxQ0=YXoB{cTaty@V{~?XmWjkeQAXvl(jlLywbwg za_~(lrtQ!jS#gTzT-Afg#QVgwiV*!LS-o3ox7?lKi8>ay9$yiyt~|&kIwDdi1(Zh0 zFh!g7!r5!ya01e=qBZ$sxTIJeK64fjFFb#2G^gB;H28Q}@G%m}wRPl-Qak3Nvksdk z-WzVoc`=N|!Z!+b&eo+~rfKXyU*Kg~?Qx*E+&O4=ce#CyYCJ6tSTM2XlErovE!^v# zuz}in%te%Vg<%;xTViCZyUy$r(oim^vy8u+xDcPzF`hBZQWs~JtamGX9PYIfzlFY* zRWS1E73C~2FXVLJ%Jdf7{0K=8bD-#Aa|tX*S{T^(z^)POx5L@&iF8~3I`0V>Qa?g- zOzo5m`aE{5TKDj$ZF}rywmQjMsc7(ouZ9C9S95ao_fP_{E`wRI_A#AoS}N-~^&|RB z=^7brWcN?o%>naAvk=b*AVmRc&E>1zj!iiQw=R^N@JP>KR`q#1j$-uM`nH(oRQHe< zHn)U%ZA>T5z%tvc%IhuIdvvIG$4nHQk-F&ooza88-yI*J<(zIi78Q3Q=Zzf0SsWB6 z1YW*pwDNS13tJ;+?0TZ zi=UEszurr+xsrCEO&$$jICy;M&Q9Oi569z=%Jjz5j>$X>=NeRR`v)u5-8iUckrAwT z(3mS5>)wx!o>}zoEon+q&;J~J&Q#93PYb|qCh1SS6k^f|P~ literal 0 HcmV?d00001 diff --git a/res/edc/images/ic_zoom_indicator_left_nor.png b/res/edc/images/ic_zoom_indicator_left_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc35fe9fe93e18b3d5ec84833b12b8f78a9d114 GIT binary patch literal 2764 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 C3$>d7 literal 0 HcmV?d00001 diff --git a/res/edc/images/ic_zoom_indicator_right_foc.png b/res/edc/images/ic_zoom_indicator_right_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..2509aa1295d00e3c3ed740fa9a89ef1ab0c3dce6 GIT binary patch literal 2777 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 HTKazgHFuh~ literal 0 HcmV?d00001 diff --git a/res/edc/images/ic_zoom_indicator_up_foc.png b/res/edc/images/ic_zoom_indicator_up_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..ee95deec26860d1ab8b6ed7b74b14a160562542e GIT binary patch literal 2803 zcmbVOc|4T)A0J0$=@Q0OjKMPPnlWQ8v&I-^CgaSts10LgFvc8ao{S@@l%sM~rVtV; z5+SP15?V*eQHrdFPLXS~j%=ylXtTfHAN$%re$VT9p6~T}zd!f$dQx|~?bx8IrwRgr zHqad@p7L?m%A>MY{>GP*73G62K=lK>1R;QgA!38bEI}|ELgz6;*`90$D<<+T+Xe(u z3gLMB0e-G71g3xoXROG;qj^F(8U(T-MGF~BE*pRZvqL$2B6OzyHWb2P5uv^qS4&r+ z13Qf47%O6X#kzSjW4TOg7L;TQv56+g33zOP0g2{C@Wq5^BJ>L{K|WvEMnEB7L;x-k z`j=6Dt~((P0udX6fm>NHEs;nF77ItBF<30}dkD%Bi9%S)Z>$9pO~7CYC>-SL1(j

NLi@yd+9x_BULx@1aEfGB4ieF!(#egUK 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.list; + vdata.index = priv->playlist.cur; + + viewmgr_update_view(VIEW_ZOOM, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_ZOOM); +} + static void _update_to_player(struct _priv *priv) { viewmgr_update_view(VIEW_MPLAYER, UPDATE_PLAYER, NULL); @@ -886,15 +897,17 @@ static void _callback_photo(void *data, const char *ev) priv = data; - if (!strcmp(ev, SRC_BTN_GALLERY_PREV)) + if (!strcmp(ev, SRC_BTN_GALLERY_PREV)) { _viewer_prev(priv); - else if (!strcmp(ev, SRC_BTN_GALLERY_NEXT)) + } else if (!strcmp(ev, SRC_BTN_GALLERY_NEXT)) { _viewer_next(priv); - else if (!strcmp(ev, SRC_BTN_ROTATE)) { + } else if (!strcmp(ev, SRC_BTN_ROTATE)) { _set_image_orientation(priv); priv->viewer.foc = BTN_LOC_ROTATE; _viewer_show(priv); + } else if (!strcmp(ev, SRC_BTN_ZOOM)) { + _set_image_zoom(priv); } } diff --git a/src/view/zoom.c b/src/view/zoom.c new file mode 100644 index 0000000..afcc0fc --- /dev/null +++ b/src/view/zoom.c @@ -0,0 +1,598 @@ +/* + * 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 "define.h" +#include "view.h" +#include "util/controller.h" + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +#define STYLE_ARROW_BTN "zoom_btn" +#define PART_ARROW_BTN "arrow_btn" + +#define ZOOM_INTERVAL 0.3 +#define ZOOM_RATIO_X2 0.5 +#define ZOOM_RATIO_X4 0.25 +#define MOVE_SIZE 10 + +enum { + DIR_UP = 0, + DIR_DOWN, + DIR_LEFT, + DIR_RIGHT, + DIR_NUM +}; + +struct _priv { + Evas_Object *win; + Evas_Object *base; + Evas_Object *photo; + Evas_Object *thumb; + Evas_Object *navi[DIR_NUM]; + app_media_info *mi; + struct controller *ctl; + double image_ratio; + double zoom_ratio; +}; + +struct _btn_info { + const char *name; + int loc; +}; + +static struct _btn_info btn_arrow[DIR_NUM] = { + { + .name = SRC_BTN_UP, + .loc = DIR_UP, + }, + { + .name = SRC_BTN_DOWN, + .loc = DIR_DOWN, + }, + { + .name = SRC_BTN_LEFT, + .loc = DIR_LEFT, + }, + { + .name = SRC_BTN_RIGHT, + .loc = DIR_RIGHT, + }, +}; + + +static app_media_info *_get_media_info(Eina_List *list, int cur) +{ + app_media *am; + app_media_info *mi; + + am = eina_list_nth(list, 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 _get_image_ratio(struct _priv *priv) +{ + Evas_Object *obj; + int w, w2; + + elm_photocam_image_size_get(priv->photo, &w, NULL); + + obj = elm_image_object_get(priv->thumb); + evas_object_geometry_get(obj, NULL, NULL, &w2, NULL); + + priv->image_ratio = w2 / (double)w; +} + +static void _get_zoom_ratio(struct _priv *priv) +{ + app_image_info *image; + int win, img; + int w, h; + double ratio; + + elm_win_screen_size_get(priv->win, NULL, NULL, &w, &h); + + image = priv->mi->image; + + if (image->width > image->height) { + img = image->width; + win = w; + ratio = ZOOM_RATIO_X2; + } else { + img = image->height; + win = h; + ratio = ZOOM_RATIO_X4; + } + + priv->zoom_ratio = ratio * img / (double)win; +} + +static void _update_navi(struct _priv *priv) +{ + Evas_Object *obj; + int px, py, pw, ph; /* photo's geometry */ + int nx, ny, nw, nh; /* thumb's geometry */ + int mx, my, mw, mh; /* navi's geometry */ + int x[DIR_NUM], y[DIR_NUM], w[DIR_NUM], h[DIR_NUM]; + int i; + + elm_photocam_image_region_get(priv->photo, &px, &py, &pw, &ph); + + obj = elm_image_object_get(priv->thumb); + evas_object_geometry_get(obj, &nx, &ny, &nw, &nh); + + mx = nx + px * priv->image_ratio; + my = ny + py * priv->image_ratio; + mw = pw * priv->image_ratio; + mh = ph * priv->image_ratio; + + /* up */ + x[DIR_UP] = nx; + y[DIR_UP] = ny; + w[DIR_UP] = nw; + h[DIR_UP] = my - ny; + + /* down */ + x[DIR_DOWN] = nx; + y[DIR_DOWN] = my + mh; + w[DIR_DOWN] = nw; + h[DIR_DOWN] = nh - mh - h[DIR_UP]; + + /* left */ + x[DIR_LEFT] = nx; + y[DIR_LEFT] = my; + w[DIR_LEFT] = mx - nx; + h[DIR_LEFT] = mh; + + /* right */ + x[DIR_RIGHT] = mx + mw; + y[DIR_RIGHT] = my; + w[DIR_RIGHT] = nw - mw - w[DIR_LEFT]; + h[DIR_RIGHT] = mh; + + for (i = 0; i < DIR_NUM; i++) { + evas_object_resize(priv->navi[i], w[i], h[i]); + evas_object_move(priv->navi[i], x[i], y[i]); + } +} + +static Eina_Bool _zoom_set(void *data) +{ + struct _priv *priv; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + priv = data; + + _get_zoom_ratio(priv); + + elm_photocam_zoom_mode_set(priv->photo, ELM_PHOTOCAM_ZOOM_MODE_MANUAL); + elm_photocam_zoom_set(priv->photo, priv->zoom_ratio); + + _get_image_ratio(priv); + _update_navi(priv); + + return ECORE_CALLBACK_CANCEL; +} + +static void _scrolled(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data) + return; + + priv = data; + + _update_navi(priv); +} + +static bool _move_image(struct _priv *priv, int dir) +{ + int x, y, w, h; + int px, py; + + elm_scroller_region_get(priv->photo, &x, &y, &w, &h); + + switch (dir) { + case DIR_UP: + y -= MOVE_SIZE; + break; + case DIR_DOWN: + y += MOVE_SIZE; + break; + case DIR_LEFT: + x -= MOVE_SIZE; + break; + case DIR_RIGHT: + x += MOVE_SIZE; + break; + default: + return false; + } + + elm_scroller_region_show(priv->photo, x, y, w, h); + + elm_scroller_region_get(priv->photo, &px, &py, NULL, NULL); + if (x != px || y != py) + return false; + + return true; +} + +static void _key_up(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Up *ev) +{ + struct _priv *priv; + struct controller *ctl; + + if (!data || !ev) + return; + + priv = data; + ctl = priv->ctl; + + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) + viewmgr_pop_view(); + else if (!strcmp(ev->keyname, KEY_UP)) + ctl->ops->signal(ctl->handle, DIR_UP, SIG_SET_UNFOCUS); + else if (!strcmp(ev->keyname, KEY_DOWN)) + ctl->ops->signal(ctl->handle, DIR_DOWN, SIG_SET_UNFOCUS); + else if (!strcmp(ev->keyname, KEY_LEFT)) + ctl->ops->signal(ctl->handle, DIR_LEFT, SIG_SET_UNFOCUS); + else if (!strcmp(ev->keyname, KEY_RIGHT)) + ctl->ops->signal(ctl->handle, DIR_RIGHT, SIG_SET_UNFOCUS); +} + +static void _key_down(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + struct _priv *priv; + struct controller *ctl; + const char *sig; + int dir; + + if (!data || !ev) + return; + + priv = data; + ctl = priv->ctl; + + if (!strcmp(ev->keyname, KEY_UP)) + dir = DIR_UP; + else if (!strcmp(ev->keyname, KEY_DOWN)) + dir = DIR_DOWN; + else if (!strcmp(ev->keyname, KEY_LEFT)) + dir = DIR_LEFT; + else if (!strcmp(ev->keyname, KEY_RIGHT)) + dir = DIR_RIGHT; + else + return; + + if (_move_image(priv, dir)) + sig = SIG_SET_FOCUS; + else + sig = SIG_SET_UNFOCUS; + + ctl->ops->signal(ctl->handle, dir, sig); +} + +static input_handler _handler = { + .key_up = _key_up, + .key_down = _key_down, +}; + +static bool _draw_image(struct _priv *priv) +{ + Evas_Object *obj; + + obj = elm_photocam_add(priv->base); + if (!obj) { + _ERR("failed to adding photocam"); + return false; + } + + priv->photo = obj; + + elm_object_focus_allow_set(obj, EINA_FALSE); + elm_scroller_policy_set(obj, + ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + elm_photocam_file_set(obj, priv->mi->file_path); + elm_photocam_paused_set(obj, EINA_TRUE); + + elm_object_part_content_set(priv->base, PART_ZOOM_CONTENT, obj); + + evas_object_smart_callback_add(obj, SIG_SCROLL, _scrolled, priv); + + return true; +} + +static bool _draw_thumbnail(struct _priv *priv) +{ + Evas_Object *obj; + + obj = elm_image_add(priv->base); + if (!obj) { + _ERR("failed to adding photocam"); + return false; + } + + priv->thumb = obj; + + evas_object_size_hint_align_set(obj, 1.0, 1.0); + elm_image_file_set(obj, priv->mi->thumbnail_path, NULL); + + elm_object_part_content_set(priv->base, PART_ZOOM_NAVI, obj); + + return true; +} + +static bool _draw_navi(struct _priv *priv) +{ + Evas_Object *obj; + int i; + + for (i = 0; i < DIR_NUM; i++) { + obj = evas_object_rectangle_add( + evas_object_evas_get(priv->base)); + if (!obj) { + _ERR("failed to add rect"); + return false; + } + + evas_object_color_set(obj, 0, 0, 0, 204); + evas_object_show(obj); + + priv->navi[i] = obj; + } + + return true; +} + +static void _draw_contents(struct _priv *priv) +{ + if (!_draw_image(priv)) + return; + + if (!_draw_thumbnail(priv)) + return; + + if (!_draw_navi(priv)) + return; + + /* zoom should set after showing photocam object */ + ecore_timer_add(ZOOM_INTERVAL, _zoom_set, priv); +} + +static bool _ui_init(struct _priv *priv) +{ + Evas_Object *obj; + struct controller *ctl; + int i; + + ctl = controller_create(priv->base); + if (!ctl) { + _ERR("failed to create controller"); + return false; + } + + for (i = 0; i < DIR_NUM; i++) { + ctl->ops->add_control(ctl->handle, + btn_arrow[i].name, btn_arrow[i].loc, + STYLE_ARROW_BTN, PART_ARROW_BTN); + + obj = ctl->ops->get_object(ctl->handle, i); + if (obj) + inputmgr_add_callback(obj, 0, &_handler, priv); + } + + priv->ctl = ctl; + + return true; +} + +static Evas_Object *_create(Evas_Object *win, void *data) +{ + struct _priv *priv; + Evas_Object *base; + 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"); + goto err; + } + + elm_layout_file_set(base, EDJEFILE, GRP_ZOOM_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; + + r = _ui_init(priv); + if (!r) { + _ERR("failed to init UI"); + evas_object_del(base); + goto err; + } + + viewmgr_set_view_data(VIEW_ZOOM, priv); + + return base; + +err: + free(priv); + return NULL; +} + +static void _show(void *view_data) +{ + struct _priv *priv; + struct controller *ctl; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + priv = view_data; + + evas_object_show(priv->base); + + _draw_contents(priv); + + ctl = priv->ctl; + ctl->ops->show(ctl->handle); + ctl->ops->focus(ctl->handle, DIR_UP, true); +} + +static void _hide(void *view_data) +{ + struct _priv *priv; + struct controller *ctl; + int i; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + priv = view_data; + + evas_object_hide(priv->base); + + if (priv->photo) + evas_object_del(priv->photo); + + if (priv->thumb) + evas_object_del(priv->thumb); + + for (i = 0; i < DIR_NUM; i++) { + if (priv->navi[i]) + evas_object_del(priv->navi[i]); + } + + ctl = priv->ctl; + ctl->ops->hide(ctl->handle); +} + +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; + } + + priv = view_data; + vdata = data; + + switch (update_type) { + case UPDATE_CONTENT: + if (!vdata) + break; + + priv->mi = _get_media_info(vdata->list, vdata->index); + break; + default: + break; + } +} + +static void _pause(void *view_data) +{ + viewmgr_pop_view(); +} + +static void _destroy(void *view_data) +{ + struct _priv *priv; + struct controller *ctl; + Evas_Object *obj; + int i; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + priv = view_data; + + ctl = priv->ctl; + + for (i = 0; i < ARRAY_SIZE(btn_arrow); i++) { + obj = ctl->ops->get_object(ctl->handle, i); + if (obj) + inputmgr_remove_callback(obj, &_handler); + } + + evas_object_del(priv->base); + + free(priv); +} + +static view_class _vclass = { + .view_id = VIEW_ZOOM, + .create = _create, + .show = _show, + .hide = _hide, + .update = _update, + .pause = _pause, + .destroy = _destroy, +}; + +view_class *view_zoom_get_vclass(void) +{ + return &_vclass; +} -- 2.7.4 From b498144f8d41fa28bae6562072206a7fef36e5d3 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 3 Sep 2015 17:20:04 +0900 Subject: [PATCH 16/16] zoom: add notify widget Change-Id: I5c6eb265ad06b846dc7cf8543e2cab324ab979e8 Signed-off-by: Minkyu Kang --- include/define.h | 3 +++ include/view/base.h | 1 - res/edc/widgets/notify.edc | 4 ++-- src/view/base.c | 10 ++++------ src/view/zoom.c | 28 ++++++++++++++++++++++++++++ 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/include/define.h b/include/define.h index a169928..a299ea1 100644 --- a/include/define.h +++ b/include/define.h @@ -93,6 +93,9 @@ #define SIG_TIMEOUT "timeout" #define SIG_SCROLL "scroll" +/* style */ +#define STYLE_TOAST "base_toast" + /* transition */ #define TRANSITION_FOCUS DECELERATE 0.20 #define TRANSITION_CLICK DECELERATE 0 diff --git a/include/view/base.h b/include/view/base.h index 95dda2e..1872b55 100644 --- a/include/view/base.h +++ b/include/view/base.h @@ -52,7 +52,6 @@ #define STYLE_BTN_VIEW_MODE "base_btn_view_mode" #define STYLE_BTN_VIEW_OPTION "base_btn_view_option" #define STYLE_BASE_PROGRESS "base_recent_progress" -#define STYLE_TOAST_FAVORITE "base_toast_favorite" #define STYLE_CTXPOPUP_VIEW_MODE "base_ctxpopup_view_mode" #endif /* __AIR_MEDIAHUB_VIEW_BASE_H__ */ diff --git a/res/edc/widgets/notify.edc b/res/edc/widgets/notify.edc index 20bf305..7b22d91 100644 --- a/res/edc/widgets/notify.edc +++ b/res/edc/widgets/notify.edc @@ -15,7 +15,7 @@ */ group { - name: "elm/notify/bottom_left/base_toast_favorite"; + name: "elm/notify/bottom_left/base_toast"; parts { part { name: "padding.bottom.left"; @@ -140,7 +140,7 @@ group { } group { - name: "elm/label/base/base_toast_favorite"; + name: "elm/label/base/base_toast"; parts { part { name: "elm.text"; diff --git a/src/view/base.c b/src/view/base.c index 39d8d3a..a24ad90 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -639,13 +639,11 @@ static void _show_toast_favorite(struct _priv *priv, const char *id) } if (favorite) - notify = util_add_notify(priv->base, STYLE_TOAST_FAVORITE, - STYLE_TOAST_FAVORITE, TEXT_FAVORITE_ADDED, - TIME_TOAST_FAVORITE); + notify = util_add_notify(priv->base, STYLE_TOAST, STYLE_TOAST, + TEXT_FAVORITE_ADDED, TIME_TOAST_FAVORITE); else - notify = util_add_notify(priv->base, STYLE_TOAST_FAVORITE, - STYLE_TOAST_FAVORITE, TEXT_FAVORITE_REMOVED, - TIME_TOAST_FAVORITE); + notify = util_add_notify(priv->base, STYLE_TOAST, STYLE_TOAST, + TEXT_FAVORITE_REMOVED, TIME_TOAST_FAVORITE); if (!notify) { _ERR("failed to add notify object"); diff --git a/src/view/zoom.c b/src/view/zoom.c index afcc0fc..da4db9f 100644 --- a/src/view/zoom.c +++ b/src/view/zoom.c @@ -26,6 +26,7 @@ #include "define.h" #include "view.h" #include "util/controller.h" +#include "util/util.h" #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) @@ -37,6 +38,9 @@ #define ZOOM_RATIO_X4 0.25 #define MOVE_SIZE 10 +#define TOAST_MESSAGE "Press Back to Escape from Zoom mode" +#define TOAST_TIMEOUT 3.0 + enum { DIR_UP = 0, DIR_DOWN, @@ -51,6 +55,7 @@ struct _priv { Evas_Object *photo; Evas_Object *thumb; Evas_Object *navi[DIR_NUM]; + Evas_Object *notify; app_media_info *mi; struct controller *ctl; double image_ratio; @@ -81,6 +86,25 @@ static struct _btn_info btn_arrow[DIR_NUM] = { }, }; +static void _hide_toast(struct _priv *priv) +{ + if (priv->notify) + evas_object_hide(priv->notify); +} + +static void _show_toast(struct _priv *priv) +{ + Evas_Object *notify; + + notify = util_add_notify(priv->base, STYLE_TOAST, STYLE_TOAST, + TOAST_MESSAGE, TOAST_TIMEOUT); + if (!notify) { + _ERR("failed to add notify object"); + return; + } + + priv->notify = notify; +} static app_media_info *_get_media_info(Eina_List *list, int cur) { @@ -490,6 +514,8 @@ static void _show(void *view_data) _draw_contents(priv); + _show_toast(priv); + ctl = priv->ctl; ctl->ops->show(ctl->handle); ctl->ops->focus(ctl->handle, DIR_UP, true); @@ -521,6 +547,8 @@ static void _hide(void *view_data) evas_object_del(priv->navi[i]); } + _hide_toast(priv); + ctl = priv->ctl; ctl->ops->hide(ctl->handle); } -- 2.7.4