From 41b883b66905bde66e0178b5729bade9d4bc23c7 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 2 Jul 2015 16:03:06 +0900 Subject: [PATCH 01/16] add gengrid item style for photo and video contents Change-Id: Ic8c66668c3fe4f972d83b9d0a37b2fa7fd2bbb68 Signed-off-by: Jehun Lim --- include/define.h | 6 + include/layout/gallery.h | 2 + res/edc/widgets/gengrid.edc | 352 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 352 insertions(+), 8 deletions(-) diff --git a/include/define.h b/include/define.h index 20da0e8..6ecf61b 100644 --- a/include/define.h +++ b/include/define.h @@ -47,4 +47,10 @@ #define COLOR_ITEM_FOCUS 0 119 246 255 #define COLOR_ITEM_FOCUS_0 0 119 246 0 +/* part */ +#define PART_ELM_TEXT_TITLE "elm.text.title" +#define PART_ELM_TEXT_PLAYTIME "elm.text.playtime" +#define PART_ELM_SWALLOW_THUMBNAIL "elm.swallow.thumbnail" +#define PART_ELM_SWALLOW_VIDEO "elm.swallow.video" + #endif /* __AIR_MEDIAHUB_DEFINE_H__ */ diff --git a/include/layout/gallery.h b/include/layout/gallery.h index aa7e914..3ea6526 100644 --- a/include/layout/gallery.h +++ b/include/layout/gallery.h @@ -21,4 +21,6 @@ #define GRP_GALLERY_LAYOUT "group.gallery_layout" +#define STYLE_GRID_GALLERY_ITEM "gallery_item" + #endif /* __AIR_MEDIAHUB_LAYOUT_GALLERY_H__ */ diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 3e9a631..789f9da 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -17,8 +17,8 @@ group { name: "elm/gengrid/item/movie_item/default"; data.item: "selectraise" "on"; - data.item: "texts" "elm.text"; - data.item: "contents" "elm.swallow.icon"; + data.item: "texts" "elm.text.title"; + data.item: "contents" "elm.swallow.thumbnail"; data.item: "focus_highlight" "on"; parts { part { @@ -89,7 +89,7 @@ group { } } part { - name: "elm.swallow.icon"; + name: PART_SWALLOW_THUMBNAIL; type: SWALLOW; scale: 1; mouse_events: 1; @@ -300,7 +300,7 @@ group { } } part { - name: "elm.text"; + name: PART_ELM_TEXT_TITLE; type: TEXT; scale: 1; description { @@ -346,14 +346,14 @@ group { target: "part_focus2"; target: "part_focus3"; target: "elm.bg.text"; - target: "elm.text"; + target: PART_ELM_TEXT_TITLE; after: "focus,in,anim"; } program { name: "focus,in,anim"; action: STATE_SET "selected" 0.0; target: "defaultbg"; - target: "elm.swallow.icon"; + target: PART_SWALLOW_THUMBNAIL; target: "part_focus1"; target: "part_focus2"; target: "part_focus3"; @@ -365,7 +365,7 @@ group { signal: "elm,state,unfocused"; source: "elm"; action: STATE_SET "default" 0.0; - target: "elm.text"; + target: PART_ELM_TEXT_TITLE; after: "focus,out,anim"; } program { @@ -381,7 +381,7 @@ group { program { name: "focus,out,anim,3"; action: STATE_SET "default" 0.0; - target: "elm.swallow.icon"; + target: PART_SWALLOW_THUMBNAIL; target: "defaultbg"; target: "part_focus1"; target: "part_focus2"; @@ -390,3 +390,339 @@ group { } } } + +group { + name: "elm/gengrid/item/gallery_item/default"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.playtime"; + data.item: "contents" "elm.swallow.thumbnail elm.swallow.video"; + data.item: "focus_highlight" "on"; + parts { + part { + name: "elm.padding.bottom_right"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 1.0 1.0; + min: 6 6; + align: 1.0 1.0; + fixed: 1 1; + } + } + part { + name: "map"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + perspective { + zplane: 0; + focal: 1000; + } + visible: 0; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + perspective.zplane: -100; + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2 { + to: "elm.padding.bottom_right"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + } + } + part { + name: "defaultbg"; + scale: 1; + type: RECT; + mouse_events: 1; + description { + state : "default" 0.0; + rel1.to: "bg"; + rel2.to: "bg"; + color: 0 0 0 115; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: PART_ELM_SWALLOW_THUMBNAIL; + scale: 1; + type: SWALLOW; + mouse_events: 1; + description { + state : "default" 0.0; + rel1.to: "defaultbg"; + rel2.to: "defaultbg"; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: PART_ELM_SWALLOW_VIDEO; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "defaultbg"; + rel2.to: "defaultbg"; + } + } + part { + name: "part_focus1"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 1.0 0.0; + } + min: 0 3; + align: 0.5 0.0; + color: COLOR_ITEM_FOCUS; + fixed: 0 1; + visible: 0; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + visible: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + visible: 1; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "part_focus2"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "part_focus1"; + relative: 0.0 1.0; + } + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + min: 3 0; + align: 0.0 0.5; + color: COLOR_ITEM_FOCUS; + fixed: 1 0; + visible: 0; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + visible: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + visible: 1; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "part_focus3"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "part_focus1"; + relative: 1.0 1.0; + } + rel2.to: "bg"; + min: 3 0; + align: 1.0 0.5; + color: COLOR_ITEM_FOCUS; + fixed: 1 0; + visible: 0; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + visible: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + visible: 1; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "part_focus4"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "part_focus2"; + relative: 1.0 1.0; + } + rel2 { + to: "part_focus3"; + relative: 0.0 1.0; + } + min: 0 3; + align: 0.5 1.0; + color: COLOR_ITEM_FOCUS; + fixed: 0 1; + visible: 0; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + visible: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + visible: 1; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "padding_playtime"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "defaultbg"; + relative: 1.0 1.0; + } + rel2.to: "defaultbg"; + min: 12 12; + align: 1.0 1.0; + fixed: 1 1; + } + } + part { + name: PART_ELM_TEXT_PLAYTIME; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "padding_playtime"; + rel2 { + to: "padding_playtime"; + relative: 0.0 0.0; + } + text { + font: FONT_LIGHT; + size: 24; + min: 1 0; + align: 1.0 1.0; + } + min: 0 24; + align: 1.0 1.0; + color: COLOR_TEXT_FOCUS; + fixed: 0 1; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "part_focus4"; + after: "focus,in,anim"; + } + program { + name: "focus,in,anim"; + action: STATE_SET "selected" 0.0; + target: "defaultbg"; + target: PART_ELM_SWALLOW_THUMBNAIL; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "part_focus4"; + transition: LINEAR 0.17; + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "part_focus4"; + transition: LINEAR 0.17; + after: "focus,out,anim"; + } + program { + name: "focus,out,anim"; + action: STATE_SET "default" 0.0; + target: PART_ELM_SWALLOW_THUMBNAIL; + target: "defaultbg"; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "part_focus4"; + } + } +} -- 2.7.4 From acc85ce5a616958c20cdce707a9fec735a63a608 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 3 Jul 2015 19:02:42 +0900 Subject: [PATCH 02/16] base: manage current focused menu button Change-Id: I9c671b2f25172788abaf3550afc7d459a7098cbf Signed-off-by: Jehun Lim --- src/view/base.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/view/base.c b/src/view/base.c index b007ef7..07247de 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -31,6 +31,7 @@ struct _priv { Evas_Object *win; Evas_Object *base; Evas_Object *btn[MENU_BTN_SIZE]; + Evas_Object *focused_btn; layoutmgr *lmgr; @@ -77,12 +78,15 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, priv = data; + if (priv->focused_btn == obj) + return; + for (i = 0; i < MENU_BTN_SIZE; i++) { if (priv->btn[i] == obj) break; } - if (i == priv->current_layout || i == MENU_BTN_SIZE) + if (i == MENU_BTN_SIZE) return; layoutmgr_hide_layout(priv->lmgr, @@ -90,6 +94,7 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, layoutmgr_show_layout(priv->lmgr, g_menu_item[i].layout_id); layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id, 0, NULL); + priv->focused_btn = obj; priv->current_layout = i; } -- 2.7.4 From 7216e7a98a386f0a07ea0b593144668b3f2ba35e Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 3 Jul 2015 19:21:25 +0900 Subject: [PATCH 03/16] fix wrong part name Change-Id: Ib7070ca23fe683282396e0972262f8f4c437449b Signed-off-by: Jehun Lim --- res/edc/widgets/gengrid.edc | 6 +++--- src/layout/movie.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 789f9da..67e69eb 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -89,7 +89,7 @@ group { } } part { - name: PART_SWALLOW_THUMBNAIL; + name: PART_ELM_SWALLOW_THUMBNAIL; type: SWALLOW; scale: 1; mouse_events: 1; @@ -353,7 +353,7 @@ group { name: "focus,in,anim"; action: STATE_SET "selected" 0.0; target: "defaultbg"; - target: PART_SWALLOW_THUMBNAIL; + target: PART_ELM_SWALLOW_THUMBNAIL; target: "part_focus1"; target: "part_focus2"; target: "part_focus3"; @@ -381,7 +381,7 @@ group { program { name: "focus,out,anim,3"; action: STATE_SET "default" 0.0; - target: PART_SWALLOW_THUMBNAIL; + target: PART_ELM_SWALLOW_THUMBNAIL; target: "defaultbg"; target: "part_focus1"; target: "part_focus2"; diff --git a/src/layout/movie.c b/src/layout/movie.c index 4855617..8d4f587 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -59,7 +59,7 @@ static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) am = data; - if (!strcmp(part, "elm.text")) { + if (!strcmp(part, PART_ELM_TEXT_TITLE)) { info = app_media_get_info(am); if (!info) { _ERR("failed to get media info"); @@ -84,7 +84,7 @@ static Evas_Object *_grid_content_get(void *data, am = data; - if (!strcmp(part, "elm.swallow.icon")) { + if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) { image = elm_image_add(obj); if (!image) { _ERR("failed to create image object"); -- 2.7.4 From a58229cc16cdb9b5e083fb8e6f1e6250859c6af0 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 3 Jul 2015 19:25:22 +0900 Subject: [PATCH 04/16] viewer: adds playermgr and support playing video Werror was disabled due to deprecated compiler warning from sound manager module Change-Id: Ia798d8b4a2900c8b8aa0c71efcf0641c2477b025 Signed-off-by: Minkyu Kang --- CMakeLists.txt | 4 +- include/util/playermgr.h | 38 ++++++ include/view/viewer.h | 1 + packaging/org.tizen.mediahub.spec | 1 + res/edc/view/viewer.edc | 17 ++- res/edc/widgets/button.edc | 2 +- src/main.c | 6 +- src/util/playermgr.c | 260 +++++++++++++++++++++++++++++++++++++ src/view/viewer.c | 264 +++++++++++++++++++++++++++++++++++--- 9 files changed, 569 insertions(+), 24 deletions(-) create mode 100644 include/util/playermgr.h create mode 100644 src/util/playermgr.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 8077938..45014bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ INCLUDE(FindPkgConfig) pkg_check_modules(PKGS REQUIRED elementary capi-appfw-application + capi-media-player app-utils) IF(NOT DEFINED PACKAGE_NAME) @@ -56,6 +57,7 @@ src/layout/music.c src/util/controller.c src/util/timeout_handler.c src/util/util.c +src/util/playermgr.c src/data/mediadata.c ) @@ -77,7 +79,7 @@ ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) FOREACH(flag ${PKGS_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall -Werror") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall") TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS}) CONFIGURE_FILE(${PACKAGE_NAME}.xml.in ${PACKAGE_NAME}.xml) diff --git a/include/util/playermgr.h b/include/util/playermgr.h new file mode 100644 index 0000000..7ba5831 --- /dev/null +++ b/include/util/playermgr.h @@ -0,0 +1,38 @@ +/* + * 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_PLAYERMGR_H__ +#define __AIR_MEDIAHUB_PLAYERMGR_H__ + +struct playermgr; + +struct playermgr *playermgr_create(Evas_Object *win); +void playermgr_destroy(struct playermgr *m); + +bool playermgr_play(struct playermgr *m, const char *path); +void playermgr_stop(struct playermgr *m); +bool playermgr_resume(struct playermgr *m); +bool playermgr_pause(struct playermgr *m); + +int playermgr_get_duration(struct playermgr *m); +int playermgr_get_position(struct playermgr *m); +bool playermgr_set_position(struct playermgr *m, int ms, + player_seek_completed_cb cb, void *data); +void playermgr_get_state(struct playermgr *m, player_state_e *state); +bool playermgr_set_completed_cb(struct playermgr *m, + player_completed_cb cb, void *data); + +#endif diff --git a/include/view/viewer.h b/include/view/viewer.h index 1babe1c..b7622f2 100644 --- a/include/view/viewer.h +++ b/include/view/viewer.h @@ -24,6 +24,7 @@ #define GRP_VIEWER_VIEW "group.viewer_view" /* part */ +#define PART_VIEWER_BG "part.viewer_bg" #define PART_VIEWER_CONTENT "part.viewer_content" #define PART_VIEWER_TITLE "part.viewer_title" #define PART_VIEWER_DATE "part.viewer_date" diff --git a/packaging/org.tizen.mediahub.spec b/packaging/org.tizen.mediahub.spec index 2a6c12a..969283d 100644 --- a/packaging/org.tizen.mediahub.spec +++ b/packaging/org.tizen.mediahub.spec @@ -10,6 +10,7 @@ Source1: %{name}.manifest BuildRequires: cmake BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(capi-media-player) BuildRequires: pkgconfig(app-utils) %define _appdir /usr/apps/%{name} diff --git a/res/edc/view/viewer.edc b/res/edc/view/viewer.edc index a8007a1..e698125 100644 --- a/res/edc/view/viewer.edc +++ b/res/edc/view/viewer.edc @@ -25,7 +25,22 @@ group { scale: 1; description { state: "default" 0.0; - color: 0 0 0 255; + color: 0 0 0 0; + } + } + part { + name: PART_VIEWER_BG; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel2 { + relative: 0.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + align: 0.0 0.0; } } part { diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 2113a5b..98bff76 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -502,7 +502,7 @@ group { script { set_int(cur_state, STATE_PAUSE); set_state(PART:"bg", "default_pause", 0.0); - set_state(PART:"color", "default", 0.0); + set_state(PART:"color", "default_pause", 0.0); } } program { diff --git a/src/main.c b/src/main.c index 3b01bb5..d68cc2a 100644 --- a/src/main.c +++ b/src/main.c @@ -34,12 +34,16 @@ struct _appdata { static Evas_Object *_add_win(const char *name) { Evas_Object *win; + int w, h; - win = elm_win_util_standard_add(NULL, name); + win = elm_win_add(NULL, name, ELM_WIN_BASIC); if (!win) return NULL; elm_win_title_set(win, MEDIAHUB_WIN_TITLE); + elm_win_alpha_set(win, EINA_TRUE); + elm_win_screen_size_get(win, NULL, NULL, &w, &h); + evas_object_resize(win, w, h); evas_object_show(win); diff --git a/src/util/playermgr.c b/src/util/playermgr.c new file mode 100644 index 0000000..07aa63c --- /dev/null +++ b/src/util/playermgr.c @@ -0,0 +1,260 @@ +/* + * 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" + +struct playermgr { + Evas_Object *win; + player_h player; +}; + +int playermgr_get_duration(struct playermgr *m) +{ + int r; + int ms; + + if (!m) { + _ERR("invalid parameter"); + return 0; + } + + r = player_get_duration(m->player, &ms); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: get_position error (%d)", r); + return 0; + } + + return ms; +} + +int playermgr_get_position(struct playermgr *m) +{ + int r; + int ms; + + if (!m) { + _ERR("invalid parameter"); + return 0; + } + + r = player_get_play_position(m->player, &ms); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: get_position error (%d)", r); + return 0; + } + + return ms; +} + +bool playermgr_set_position(struct playermgr *m, int ms, + player_seek_completed_cb cb, void *data) +{ + int r; + + if (!m) { + _ERR("invalid parameter"); + return false; + } + + r = player_set_play_position(m->player, ms, false, cb, data); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set_position error (%d)", r); + return false; + } + + return true; +} + +void playermgr_get_state(struct playermgr *m, player_state_e *state) +{ + int r; + + if (!m) { + _ERR("invalid parameter"); + return; + } + + r = player_get_state(m->player, state); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: get_state error (%d)", r); + *state = PLAYER_STATE_NONE; + } +} + +bool playermgr_pause(struct playermgr *m) +{ + player_state_e state; + int r; + + if (!m) { + _ERR("invalid parameter"); + return false; + } + + playermgr_get_state(m, &state); + if (state == PLAYER_STATE_PAUSED) + return true; + + r = player_pause(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: pause error (%d)", r); + return false; + } + + return true; +} + +bool playermgr_resume(struct playermgr *m) +{ + player_state_e state; + int r; + + if (!m) { + _ERR("invalid parameter"); + return false; + } + + playermgr_get_state(m, &state); + if (state == PLAYER_STATE_PLAYING) + return true; + + r = player_start(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: start error (%d)", r); + return false; + } + + return true; +} + +void playermgr_stop(struct playermgr *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + player_pause(m->player); + player_stop(m->player); + player_unprepare(m->player); +} + +bool playermgr_play(struct playermgr *m, const char *path) +{ + int r; + + if (!m || !path) { + _ERR("invalid parameter"); + return false; + } + + playermgr_stop(m); + + r = player_set_uri(m->player, path); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set_uri error (%d)", r); + return false; + } + + r = player_set_display(m->player, PLAYER_DISPLAY_TYPE_OVERLAY, + GET_DISPLAY(m->win)); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set_display error (%d)", r); + return false; + } + + r = player_set_display_mode(m->player, PLAYER_DISPLAY_MODE_FULL_SCREEN); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set_display_mode error (%d)", r); + return false; + } + + r = player_prepare(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: prepare error (%d)", r); + return false; + } + + r = player_start(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: start error (%d)", r); + return false; + } + + return true; +} + +bool playermgr_set_completed_cb(struct playermgr *m, + player_completed_cb cb, void *data) +{ + int r; + + r = player_set_completed_cb(m->player, cb, data); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: set callback error (%d)", r); + return false; + } + + return true; +} + +struct playermgr *playermgr_create(Evas_Object *win) +{ + struct playermgr *m; + int r; + + if (!win) { + _ERR("invalid parameter"); + return NULL; + } + + m = calloc(1, sizeof(*m)); + if (!m) { + _ERR("failed to allocate"); + return NULL; + } + + r = player_create(&m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("player: creation error (%d)", r); + free(m); + return NULL; + } + + m->win = win; + + return m; +} + +void playermgr_destroy(struct playermgr *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + if (m->player) { + playermgr_stop(m); + player_destroy(m->player); + } + + free(m); +} diff --git a/src/view/viewer.c b/src/view/viewer.c index 91c09be..898aa07 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -20,16 +20,21 @@ #include #include #include +#include #include #include "define.h" #include "util/controller.h" #include "util/timeout_handler.h" +#include "util/playermgr.h" +#include "util/util.h" #define STYLE_VIEWER_BTN "viewer_btn" #define PART_VIEWER_BTN "control_btn" +#define PLAY_BTN_LOC 2 #define VIEWER_TIMEOUT 3.0 +#define VIEWER_INTERVAL 0.1 #define VIDEO_COPYRIGHT "Unknown" @@ -62,10 +67,12 @@ struct _priv { Evas_Object *photo; Evas_Object *photo_pre; Evas_Object *favorite; + Evas_Object *timer; struct _viewer viewer; struct _playlist playlist; struct timeout_handler *timeout; + struct playermgr *player; bool bar_show; }; @@ -139,6 +146,8 @@ struct _viewer_info { void (*callback)(void *, const char *); }; +static void _player_play(struct _priv *priv); + static void _callback_movie(void *data, const char *ev); static void _callback_photo(void *data, const char *ev); static void _callback_video(void *data, const char *ev); @@ -247,7 +256,22 @@ static void _up_string(char *str) } } -static void _draw_thumbnail(struct _priv *priv, int id, app_media_info *mi) +static void _set_bg_color(struct _priv *priv, int r, int g, int b, int a) +{ + Evas_Object *bg; + + bg = evas_object_rectangle_add(evas_object_evas_get(priv->base)); + if (!bg) { + _ERR("failed to add rect"); + return; + } + + evas_object_color_set(bg, r, g, b, a); + + elm_object_part_content_set(priv->base, PART_VIEWER_BG, bg); +} + +static void _draw_thumbnail(struct _priv *priv, app_media_info *mi) { Evas_Object *obj; @@ -273,6 +297,23 @@ static void _draw_thumbnail(struct _priv *priv, int id, app_media_info *mi) priv->photo = obj; } +static void _remove_thumbnail(struct _priv *priv) +{ + if (priv->photo_pre) { + evas_object_del(priv->photo_pre); + priv->photo_pre = NULL; + } + + if (priv->photo) { + evas_object_del(priv->photo); + priv->photo = NULL; + } + + _set_bg_color(priv, 0, 0, 0, 0); + + elm_object_part_content_unset(priv->base, PART_VIEWER_CONTENT); +} + static void _image_loaded(void *data, Evas_Object *obj, void *ev) { struct _priv *priv; @@ -304,15 +345,15 @@ static void _image_loaded_detail(void *data, Evas_Object *obj, void *ev) priv->photo_pre = NULL; } -static void _load_image_file(struct _priv *priv, int id, app_media_info *mi) +static void _draw_contents(struct _priv *priv, int id, app_media_info *mi) { Evas_Object *obj; if (id == VIEWER_MOVIE) { - elm_object_part_content_unset(priv->base, PART_VIEWER_CONTENT); + _player_play(priv); return; } else if (id == VIEWER_VIDEO) { - _draw_thumbnail(priv, id, mi); + _draw_thumbnail(priv, mi); return; } @@ -346,6 +387,8 @@ static void _load_image_file(struct _priv *priv, int id, app_media_info *mi) priv->photo_pre = obj; } + _set_bg_color(priv, 0, 0, 0, 255); + elm_photocam_file_set(obj, mi->file_path); elm_photocam_zoom_mode_set(obj, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT); } @@ -393,6 +436,14 @@ static void _draw_time_info(struct _priv *priv, int id, app_media_info *mi) elm_object_part_text_set(priv->base, PART_VIEWER_TOTAL, total); } +static void _draw_progress_info(struct _priv *priv, int ms) +{ + char progress[32] = {0,}; + + _time_string(progress, sizeof(progress), ms); + elm_object_part_text_set(priv->base, PART_VIEWER_PROGRESS, progress); +} + static void _draw_favorite_icon(struct _priv *priv, int id, app_media_info *mi) { if (!mi->favorite) @@ -402,26 +453,37 @@ static void _draw_favorite_icon(struct _priv *priv, int id, app_media_info *mi) PART_VIEWER_FAVORITE, priv->favorite); } -static bool _viewer_show(struct _priv *priv, int cur, int foc) +static app_media_info *_get_current_media_info(struct _priv *priv) { - struct _viewer_info *info; - struct controller *ctl; - int id; - int loc; app_media *am; app_media_info *mi; - am = eina_list_nth(priv->playlist.list, cur); + am = eina_list_nth(priv->playlist.list, priv->playlist.cur); if (!am) { _ERR("failed to get app_media"); - return false; + return NULL; } - priv->playlist.cur = cur; - mi = app_media_get_info(am); if (!mi) { _ERR("failed to getting media info"); + return NULL; + } + + return mi; +} + +static bool _viewer_show(struct _priv *priv, int foc) +{ + struct _viewer_info *info; + struct controller *ctl; + int id; + int loc; + app_media_info *mi; + + mi = _get_current_media_info(priv); + if (!mi) { + _ERR("failed to getting media info"); return false; } @@ -455,11 +517,15 @@ static bool _viewer_show(struct _priv *priv, int cur, int foc) case DIR_NONE: default: loc = info->focus_loc; + if (id == VIEWER_MOVIE) { + ctl->ops->signal(ctl->handle, + PLAY_BTN_LOC, SIG_SET_PAUSE); + } break; } ctl->ops->focus(ctl->handle, loc, true); - _load_image_file(priv, id, mi); + _draw_contents(priv, id, mi); _draw_title_bar(priv, id, mi); _draw_time_info(priv, id, mi); @@ -527,7 +593,7 @@ static bool _viewer_prev(struct _priv *priv) else priv->playlist.cur--; - r = _viewer_show(priv, priv->playlist.cur, DIR_PREV); + r = _viewer_show(priv, DIR_PREV); return r; } @@ -546,7 +612,7 @@ static bool _viewer_next(struct _priv *priv) else priv->playlist.cur++; - r = _viewer_show(priv, priv->playlist.cur, DIR_NEXT); + r = _viewer_show(priv, DIR_NEXT); return r; } @@ -623,8 +689,141 @@ err: return false; } +static Eina_Bool _timer_cb(void *data) +{ + struct _priv *priv; + int ms; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + priv = data; + + ms = playermgr_get_position(priv->player); + + _draw_progress_info(priv, ms); + + return ECORE_CALLBACK_RENEW; +} + +static void _timer_reset(struct _priv *priv) +{ + if (priv->timer) + ecore_timer_reset(priv->timer); + else + priv->timer = ecore_timer_add(VIEWER_INTERVAL, _timer_cb, priv); +} + +static void _player_play(struct _priv *priv) +{ + app_media_info *mi; + player_state_e state; + + playermgr_get_state(priv->player, &state); + + switch (state) { + case PLAYER_STATE_PAUSED: + if (priv->timer) + ecore_timer_thaw(priv->timer); + + playermgr_resume(priv->player); + break; + case PLAYER_STATE_PLAYING: + if (priv->timer) + ecore_timer_freeze(priv->timer); + + playermgr_pause(priv->player); + break; + case PLAYER_STATE_IDLE: + case PLAYER_STATE_READY: + mi = _get_current_media_info(priv); + if (!mi) { + _ERR("failed to getting media info"); + return; + } + + _remove_thumbnail(priv); + _timer_reset(priv); + + playermgr_play(priv->player, mi->file_path); + + break; + default: + _ERR("player was not created"); + break; + } +} + +static void _player_stop(struct _priv *priv) +{ + struct controller *ctl; + + ecore_timer_del(priv->timer); + priv->timer = NULL; + + playermgr_stop(priv->player); + + ctl = priv->viewer.ctl[priv->viewer.cur]; + ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); +} + +static void _player_complete_cb(void *data) +{ + struct _priv *priv; + + if (!data) + return; + + priv = data; + + ecore_timer_del(priv->timer); + priv->timer = NULL; +} + +static void _player_set_position_cb(void *data) +{ + struct _priv *priv; + struct controller *ctl; + int ms; + + if (!data) + return; + + priv = data; + + ms = playermgr_get_position(priv->player); + _draw_progress_info(priv, ms); + + /* FIXME: what will you do here? */ + playermgr_pause(priv->player); + + if (priv->timer) + ecore_timer_freeze(priv->timer); + + ctl = priv->viewer.ctl[priv->viewer.cur]; + ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); +} + static void _callback_movie(void *data, const char *ev) { + struct _priv *priv; + int ms; + + if (!data || !ev) + return; + + priv = data; + + if (!strcmp(ev, SRC_BTN_PREV)) { + playermgr_set_position(priv->player, 0, + _player_set_position_cb, priv); + } else if (!strcmp(ev, SRC_BTN_NEXT)) { + ms = playermgr_get_duration(priv->player); + playermgr_set_position(priv->player, ms - 1000, + _player_set_position_cb, priv); + } else if (!strcmp(ev, SRC_BTN_PLAY)) { + _player_play(priv); + } } static void _callback_photo(void *data, const char *ev) @@ -636,11 +835,10 @@ static void _callback_photo(void *data, const char *ev) priv = data; - if (!strcmp(ev, SRC_BTN_PHOTO_PREV)) { + if (!strcmp(ev, SRC_BTN_PHOTO_PREV)) _viewer_prev(priv); - } else if (!strcmp(ev, SRC_BTN_PHOTO_NEXT)) { + else if (!strcmp(ev, SRC_BTN_PHOTO_NEXT)) _viewer_next(priv); - } } static void _callback_video(void *data, const char *ev) @@ -653,9 +851,13 @@ static void _callback_video(void *data, const char *ev) priv = data; if (!strcmp(ev, SRC_BTN_PREV)) { + _player_stop(priv); _viewer_prev(priv); } else if (!strcmp(ev, SRC_BTN_NEXT)) { + _player_stop(priv); _viewer_next(priv); + } else if (!strcmp(ev, SRC_BTN_PLAY)) { + _player_play(priv); } } @@ -663,6 +865,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; Evas_Object *base; + struct playermgr *player; bool r; if (!win) { @@ -695,9 +898,25 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->playlist.list = NULL; priv->playlist.cur = 0; + player = playermgr_create(win); + if (!player) { + _ERR("failed to create player"); + return NULL; + } + + r = playermgr_set_completed_cb(player, _player_complete_cb, priv); + if (!r) { + _ERR("failed to set callback"); + playermgr_destroy(player); + return NULL; + } + + priv->player = player; + r = _ui_init(priv); if (!r) { _ERR("failed to init UI"); + playermgr_destroy(player); return NULL; } @@ -721,7 +940,7 @@ static void _show(void *view_data) priv = view_data; /* FIXME: test code */ - _viewer_show(priv, priv->playlist.cur, DIR_NONE); + _viewer_show(priv, DIR_NONE); timeout_handler_reset(priv->timeout); @@ -763,6 +982,11 @@ static void _destroy(void *view_data) timeout_handler_fini(priv->timeout); + ecore_timer_del(priv->timer); + priv->timer = NULL; + + playermgr_destroy(priv->player); + evas_object_del(priv->base); free(priv); -- 2.7.4 From 2c25e27e9f1e934c3edc75faacdbad131df69bd0 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Mon, 6 Jul 2015 17:32:45 +0900 Subject: [PATCH 05/16] add listmgr to draw and update the thumbnail area Change-Id: I0cb4a9aeaf3e8d771fa720661e4caa60e897ea00 Signed-off-by: Jehun Lim --- CMakeLists.txt | 1 + include/util/listmgr.h | 38 ++++++++++ src/layout/movie.c | 163 +++++++++++---------------------------- src/util/listmgr.c | 201 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 284 insertions(+), 119 deletions(-) create mode 100644 include/util/listmgr.h create mode 100644 src/util/listmgr.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 45014bc..cba373b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,6 +55,7 @@ src/layout/movie.c src/layout/gallery.c src/layout/music.c src/util/controller.c +src/util/listmgr.c src/util/timeout_handler.c src/util/util.c src/util/playermgr.c diff --git a/include/util/listmgr.h b/include/util/listmgr.h new file mode 100644 index 0000000..4889e3d --- /dev/null +++ b/include/util/listmgr.h @@ -0,0 +1,38 @@ +/* + * 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_LISTMGR_H__ +#define __AIR_MEDIAHUB_LISTMGR_H__ + +struct listmgr; + +struct listmgr_data { + int grid_item_x; + int grid_item_y; + int grid_num_item; + + int box_padding; + + struct grid_class *gclass; +}; + +struct listmgr *listmgr_create(Evas_Object *base, void *data); +void listmgr_destroy(struct listmgr *listmgr); + +bool listmgr_draw_list_area(struct listmgr *lmgr); +bool listmgr_update_list_area(struct listmgr *lmgr, Eina_List *list); + +#endif /* __AIR_MEDIAHUB_LISTMGR_H__ */ diff --git a/src/layout/movie.c b/src/layout/movie.c index 8d4f587..af6855a 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -18,22 +18,22 @@ #include #include #include -#include #include +#include #include "define.h" #include "data/mediadata.h" -#include "util/util.h" +#include "util/listmgr.h" #define LIST_MEDIA_COND "media_type=1 AND copyright NOT LIKE \"Unknown\"" -#define TEXT_NOCONTENT "No Movie Content" +#define TEXT_NOCONTENT "No Movies" -#define NUM_CONTENT 2 -#define SIZE_GRID_ITEM_X 404 -#define SIZE_GRID_ITEM_Y 320 +#define GRID_ITEM_X 404 +#define GRID_ITEM_Y 320 +#define GRID_NUM_ITEM 2 -#define PADDING_BOX_ITEM 62 +#define BOX_PADDING 62 struct _priv { Evas_Object *base; @@ -42,7 +42,7 @@ struct _priv { layoutmgr *lmgr; - struct gridmgr *gmgr; + struct listmgr *listmgr; struct mediadata *md; @@ -109,75 +109,34 @@ static Evas_Object *_grid_content_get(void *data, return NULL; } -static struct grid_class gclass = { +static struct grid_class _gclass = { .item_style = STYLE_GRID_MOVIE_ITEM, .text_get = _grid_text_get, .content_get = _grid_content_get }; -static int _get_grid_size(int count) -{ - int size; - - size = count / NUM_CONTENT; - if (count % NUM_CONTENT > 0) - size++; - - return size; -} - -static Evas_Object *_draw_list_item(struct _priv *priv, struct group_info *gi) +static struct listmgr_data *_create_listmgr_data(void) { - Evas_Object *ly, *btn, *grid; - int size; - - ly = elm_layout_add(priv->box); - if (!ly) { - _ERR("failed to create layout object"); - return NULL; - } - - elm_layout_file_set(ly, EDJEFILE, GRP_LIST_ITEM); - - btn = elm_button_add(ly); - if (!btn) { - _ERR("failed to create button object"); - evas_object_del(ly); - return NULL; - } - - elm_object_style_set(btn, STYLE_BTN_INDEX); - elm_object_text_set(btn, gi->name); - - grid = util_add_gengrid(ly, SIZE_GRID_ITEM_X, SIZE_GRID_ITEM_Y); - if (!grid) { - _ERR("failed to create gengrid object"); - evas_object_del(ly); - return NULL; - } + struct listmgr_data *data; - if (!gridmgr_add_grid(priv->gmgr, gi->name, grid, &gclass)) { - _ERR("failed to add grid"); - evas_object_del(ly); + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("failed to allocate listmgr data"); return NULL; } - size = _get_grid_size(eina_list_count(gi->list)); + data->grid_item_x = GRID_ITEM_X; + data->grid_item_y = GRID_ITEM_Y; + data->grid_num_item = GRID_NUM_ITEM; + data->box_padding = BOX_PADDING; + data->gclass = &_gclass; - evas_object_size_hint_min_set(grid, size * SIZE_GRID_ITEM_X, - NUM_CONTENT * SIZE_GRID_ITEM_Y); - - elm_object_part_content_set(ly, PART_ITEM_TITLE, btn); - elm_object_part_content_set(ly, PART_ITEM_CONTENT, grid); - - return ly; + return data; } static void _update_list_area(struct _priv *priv) { - Eina_List *list, *l; - Evas_Object *ly; - struct group_info *gi; + Eina_List *list; if (priv->media_list) return; @@ -189,58 +148,16 @@ static void _update_list_area(struct _priv *priv) return; } - EINA_LIST_FOREACH(list, l, gi) { - ly = _draw_list_item(priv, gi); - if (!ly) { - _ERR("failed to draw list item"); - return; - } - - if (!gridmgr_append_list(priv->gmgr, gi->name, gi->list)) { - _ERR("failed to append list in grid"); - return; - } - - evas_object_show(ly); - - elm_box_pack_end(priv->box, ly); - } + if (!listmgr_update_list_area(priv->listmgr, list)) + _ERR("failed to update list area"); priv->media_list = list; } -static bool _draw_list_area(struct _priv *priv) -{ - Evas_Object *scr, *box; - - scr = util_add_scroller(priv->layout); - if (!scr) { - _ERR("failed to create scroller object"); - return false; - } - - box = util_add_box(scr); - if (!box) { - _ERR("failed to create box object"); - evas_object_del(scr); - return false; - } - - elm_box_padding_set(box, PADDING_BOX_ITEM, 0); - - evas_object_show(box); - elm_object_content_set(scr, box); - - elm_object_part_content_set(priv->layout, PART_CONTENT, scr); - - priv->box = box; - - return true; -} - static bool _create(layoutmgr *lmgr, void *data) { - struct gridmgr *gmgr; + struct listmgr *listmgr; + struct listmgr_data *ldata; struct mediadata *md; struct _priv *priv; Evas_Object *base, *layout; @@ -273,36 +190,44 @@ static bool _create(layoutmgr *lmgr, void *data) goto err2; } - gmgr = gridmgr_create(); - if (!gmgr) { - _ERR("failed to create gridmgr"); + ldata = _create_listmgr_data(); + if (!ldata) { + _ERR("failed to create listmgr data"); goto err2; } + listmgr = listmgr_create(layout, (void *)ldata); + if (!listmgr) { + _ERR("failed to create listmgr"); + goto err3; + } + md = mediadata_create(LIST_MEDIA_COND, E_SOURCE_ALL, E_SORT_NAME); if (!md) { _ERR("failed to create mediadata"); - gridmgr_destroy(gmgr); - goto err2; + listmgr_destroy(listmgr); + goto err3; } priv->base = base; priv->layout = layout; priv->lmgr = lmgr; - priv->gmgr = gmgr; + priv->listmgr = listmgr; priv->md = md; layoutmgr_set_layout_data(lmgr, LAYOUT_MOVIE, priv); - if (!_draw_list_area(priv)) { + if (!listmgr_draw_list_area(priv->listmgr)) { _ERR("failed to draw list area"); mediadata_destroy(md); - gridmgr_destroy(gmgr); - goto err2; + listmgr_destroy(listmgr); + goto err3; } return true; +err3: + free(ldata); err2: evas_object_del(layout); err: @@ -321,11 +246,11 @@ static void _destroy(void *layout_data) priv = layout_data; - gridmgr_destroy(priv->gmgr); - mediadata_free_list(priv->media_list); mediadata_destroy(priv->md); + listmgr_destroy(priv->listmgr); + evas_object_del(priv->layout); free(priv); } diff --git a/src/util/listmgr.c b/src/util/listmgr.c new file mode 100644 index 0000000..b5ca603 --- /dev/null +++ b/src/util/listmgr.c @@ -0,0 +1,201 @@ +/* + * 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 "define.h" +#include "data/mediadata.h" +#include "util/listmgr.h" +#include "util/util.h" + +struct listmgr { + Evas_Object *base; + Evas_Object *box; + + struct gridmgr *gmgr; + struct listmgr_data *data; +}; + +static int _get_grid_size(int count, int num_item) +{ + int size; + + size = count / num_item; + if (count % num_item > 0) + size++; + + return size; +} + +static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) +{ + Evas_Object *ly, *btn, *grid; + struct listmgr_data *data; + int size; + + 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); + + btn = elm_button_add(ly); + if (!btn) { + _ERR("failed to create button object"); + evas_object_del(ly); + return NULL; + } + + elm_object_style_set(btn, STYLE_BTN_INDEX); + elm_object_text_set(btn, gi->name); + + grid = util_add_gengrid(ly, data->grid_item_x, data->grid_item_y); + if (!grid) { + _ERR("failed to create gengrid object"); + evas_object_del(ly); + return NULL; + } + + if (!gridmgr_add_grid(lmgr->gmgr, gi->name, grid, data->gclass)) { + _ERR("failed to add grid"); + evas_object_del(ly); + return NULL; + } + + size = _get_grid_size(eina_list_count(gi->list), data->grid_num_item); + + evas_object_size_hint_min_set(grid, size * data->grid_item_x, + data->grid_num_item * data->grid_item_y); + + elm_object_part_content_set(ly, PART_ITEM_TITLE, btn); + elm_object_part_content_set(ly, PART_ITEM_CONTENT, grid); + + return ly; +} + +bool listmgr_update_list_area(struct listmgr *lmgr, Eina_List *list) +{ + Evas_Object *ly; + Eina_List *l; + struct group_info *gi; + + if (!lmgr) { + _ERR("invalid argument"); + return false; + } + + EINA_LIST_FOREACH(list, l, gi) { + ly = _draw_list_item(lmgr, gi); + if (!ly) { + _ERR("failed to draw list item"); + return false; + } + + if (!gridmgr_append_list(lmgr->gmgr, gi->name, gi->list)) { + _ERR("failed to append list in grid"); + return false; + } + + evas_object_show(ly); + + elm_box_pack_end(lmgr->box, ly); + } + + return true; +} + +bool listmgr_draw_list_area(struct listmgr *lmgr) +{ + Evas_Object *scr, *box; + + if (!lmgr) { + _ERR("invalid argument"); + return false; + } + + scr = util_add_scroller(lmgr->base); + if (!scr) { + _ERR("failed to create scroller object"); + return false; + } + + box = util_add_box(scr); + if (!box) { + _ERR("failed to create box object"); + evas_object_del(scr); + return false; + } + + elm_box_padding_set(box, lmgr->data->box_padding, 0); + + evas_object_show(box); + elm_object_content_set(scr, box); + + elm_object_part_content_set(lmgr->base, PART_CONTENT, scr); + + lmgr->box = box; + + return true; +} + +struct listmgr *listmgr_create(Evas_Object *base, void *data) +{ + struct gridmgr *gmgr; + struct listmgr *lmgr; + + if (!base || !data) { + _ERR("invalid argument"); + return NULL; + } + + lmgr = calloc(1, sizeof(*lmgr)); + if (!lmgr) { + _ERR("failed to allocate listmgr"); + return NULL; + } + + gmgr = gridmgr_create(); + if (!gmgr) { + _ERR("failed to create gridmgr"); + free(lmgr); + return false; + } + + lmgr->base = base; + lmgr->gmgr = gmgr; + lmgr->data = (struct listmgr_data *)data; + + return lmgr; +} + +void listmgr_destroy(struct listmgr *lmgr) +{ + if (!lmgr) { + _ERR("invalid argument"); + return; + } + + gridmgr_destroy(lmgr->gmgr); + free(lmgr->data); + + free(lmgr); +} -- 2.7.4 From 387651053ee860f7827722a7ca7edec1b3b4546e Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 7 Jul 2015 10:46:29 +0900 Subject: [PATCH 06/16] mediadata: add function to create list with media modified time Change-Id: I3ef1500a380bccfb49f06f40dc57f073d9767031 Signed-off-by: Jehun Lim --- include/data/mediadata.h | 1 + src/data/mediadata.c | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/include/data/mediadata.h b/include/data/mediadata.h index 006eaac..557c85f 100644 --- a/include/data/mediadata.h +++ b/include/data/mediadata.h @@ -36,6 +36,7 @@ enum sort_type { enum list_type { E_LIST_NAME = 0, + E_LIST_DATE, E_LIST_MAX }; diff --git a/src/data/mediadata.c b/src/data/mediadata.c index 04556b0..16504bb 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -29,6 +29,8 @@ static int _compare_cb_name(const void *, const void *); static int _compare_title(struct group_info *, app_media_info *); static char *_get_title(app_media_info *); +static int _compare_modified_time(struct group_info *, app_media_info *); +static char *_get_modified_time(app_media_info *); enum _filter_type { E_FILTER_FOLDER = 0, @@ -77,6 +79,10 @@ static struct _list_info g_list_info[E_LIST_MAX] = { [E_LIST_NAME] = { .media_cmp = _compare_title, .name_get = _get_title, + }, + [E_LIST_DATE] = { + .media_cmp = _compare_modified_time, + .name_get = _get_modified_time, } }; @@ -115,6 +121,17 @@ static bool _create_filter(struct _data *data, filter_h *filter, int type) return true; } +static char *_get_date_string(time_t time) +{ + struct tm tm; + char buf[32]; + + localtime_r(&time, &tm); + strftime(buf, sizeof(buf), "%Y.%m.%d", &tm); + + return strdup(buf); +} + static int _compare_title(struct group_info *gi, app_media_info *info) { if (!gi || !gi->name || !info->title) @@ -131,6 +148,28 @@ static char *_get_title(app_media_info *info) return strndup(info->title, 1); } +static int _compare_modified_time(struct group_info *gi, app_media_info *info) +{ + char *date; + int r; + + if (!gi || !gi->name) + return -1; + + date = _get_date_string(info->modified_time); + + r = strcasecmp(gi->name, date); + + free(date); + + return r; +} + +static char *_get_modified_time(app_media_info *info) +{ + return _get_date_string(info->modified_time); +} + static int _compare_cb_date(const void *data1, const void *data2) { app_media *am1, *am2; @@ -145,7 +184,7 @@ static int _compare_cb_date(const void *data1, const void *data2) if (!info1 || !info2) return -1; - if (info1->modified_time > info2->modified_time) + if (info1->modified_time < info2->modified_time) return 1; return -1; -- 2.7.4 From 1d50394f81d736ba0076c9cb970e3c159bafc425 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Mon, 6 Jul 2015 21:43:42 +0900 Subject: [PATCH 07/16] gallery: draw content list area Change-Id: I7c8b100d699b9c0e48337b0418a738b7fe0414fd Signed-off-by: Jehun Lim --- include/layout/movie.h | 4 -- include/util/util.h | 1 + include/view/base.h | 14 +++- res/edc/layout/gallery.edc | 1 + res/edc/layout/movie.edc | 62 ---------------- res/edc/view/base.edc | 62 ++++++++++++++++ res/edc/widgets/gengrid.edc | 26 ++++--- src/layout/gallery.c | 170 ++++++++++++++++++++++++++++++++++++++++++-- src/layout/movie.c | 19 +++-- src/util/util.c | 19 +++++ src/view/base.c | 2 +- 11 files changed, 286 insertions(+), 94 deletions(-) diff --git a/include/layout/movie.h b/include/layout/movie.h index 4d83ecd..5d10efc 100644 --- a/include/layout/movie.h +++ b/include/layout/movie.h @@ -20,14 +20,10 @@ #define LAYOUT_MOVIE "LAYOUT_MOVIE" #define GRP_MOVIE_LAYOUT "group.movie_layout" -#define GRP_LIST_ITEM "group.list_item" #define PART_CONTENT "part.content" #define PART_NOCONTENT "part.nocontent" -#define PART_ITEM_TITLE "part.item_title" -#define PART_ITEM_CONTENT "part.item_content" -#define STYLE_BTN_INDEX "base_btn_index" #define STYLE_GRID_MOVIE_ITEM "movie_item" #endif /* __AIR_MEDIAHUB_LAYOUT_MOVIE_H__ */ diff --git a/include/util/util.h b/include/util/util.h index 59aefce..9f17b5f 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -20,6 +20,7 @@ Evas_Object *util_add_box(Evas_Object *base); Evas_Object *util_add_gengrid(Evas_Object *base, int item_size_x, int item_size_y); +Evas_Object *util_add_image(Evas_Object *base, const char *file); Evas_Object *util_add_scroller(Evas_Object *base); #endif /* __AIR_MEDIAHUB_UTIL_H__ */ diff --git a/include/view/base.h b/include/view/base.h index 470bc93..a40dd4e 100644 --- a/include/view/base.h +++ b/include/view/base.h @@ -17,15 +17,27 @@ #ifndef __AIR_MEDIAHUB_VIEW_BASE_H__ #define __AIR_MEDIAHUB_VIEW_BASE_H__ +/* view */ #define VIEW_BASE "VIEW_BASE" +/* group */ #define GRP_BASE_VIEW "group.base_view" +#define GRP_LIST_ITEM "group.list_item" +/* part */ #define PART_TITLE "part.title" #define PART_MENU_AREA "part.menu_area" #define PART_THUMBNAIL_AREA "part.thumbnail_area" #define PART_BOTTOM_AREA "part.bottom_area" -#define STYLE_MENU_BTN "base_btn_menu" +#define PART_ITEM_TITLE "part.item_title" +#define PART_ITEM_CONTENT "part.item_content" + +/* images */ +#define IMAGE_THUMBNAIL_PLAY IMAGEDIR"/ic_thumbnail_play.png" + +/* style */ +#define STYLE_BTN_MENU "base_btn_menu" +#define STYLE_BTN_INDEX "base_btn_index" #endif /* __AIR_MEDIAHUB_VIEW_BASE_H__ */ diff --git a/res/edc/layout/gallery.edc b/res/edc/layout/gallery.edc index 520e09a..a773e3d 100644 --- a/res/edc/layout/gallery.edc +++ b/res/edc/layout/gallery.edc @@ -16,4 +16,5 @@ group { name: GRP_GALLERY_LAYOUT; + inherit: GRP_MOVIE_LAYOUT; } diff --git a/res/edc/layout/movie.edc b/res/edc/layout/movie.edc index fa64707..d029dd9 100644 --- a/res/edc/layout/movie.edc +++ b/res/edc/layout/movie.edc @@ -74,65 +74,3 @@ group { } } } - -group { - name: GRP_LIST_ITEM; - parts { - part { - name: "area"; - type: RECT; - scale: 1; - description { - state: "default" 0.0; - min: 0 703; - fixed: 0 1; - visible: 0; - } - } - part { - name: PART_ITEM_TITLE; - type: SWALLOW; - scale: 1; - description { - state: "default" 0.0; - rel1.to: "area"; - rel2 { - to: "area"; - relative: 1.0 0.0; - } - min: 0 36; - align: 0.5 0.0; - fixed: 0 1; - } - } - part { - name: "padding_content"; - type: SPACER; - scale: 1; - description { - state: "default" 0.0; - rel1 { - to: PART_ITEM_TITLE; - relative: 0.0 1.0; - } - rel2.to: PART_ITEM_TITLE; - min: 0 28; - align: 0.5 0.0; - fixed: 0 1; - } - } - part { - name: PART_ITEM_CONTENT; - type: SWALLOW; - scale: 1; - description { - state: "default" 0.0; - rel1 { - to: "padding_content"; - relative: 0.0 1.0; - } - rel2.to: "area"; - } - } - } -} diff --git a/res/edc/view/base.edc b/res/edc/view/base.edc index 4ad5a83..931ffda 100644 --- a/res/edc/view/base.edc +++ b/res/edc/view/base.edc @@ -154,3 +154,65 @@ group { } } } + +group { + name: GRP_LIST_ITEM; + parts { + part { + name: "area"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 703; + fixed: 0 1; + visible: 0; + } + } + part { + name: PART_ITEM_TITLE; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "area"; + rel2 { + to: "area"; + relative: 1.0 0.0; + } + min: 0 36; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: "padding_content"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_ITEM_TITLE; + relative: 0.0 1.0; + } + rel2.to: PART_ITEM_TITLE; + min: 0 28; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: PART_ITEM_CONTENT; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_content"; + relative: 0.0 1.0; + } + rel2.to: "area"; + } + } + } +} diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 67e69eb..624f553 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -120,7 +120,7 @@ group { to: "bg"; relative: 1.0 0.0; } - min: 0 3; + min: 0 6; align: 0.5 0.0; color: COLOR_ITEM_FOCUS; fixed: 0 1; @@ -158,7 +158,7 @@ group { to: "elm.bg.text"; relative: 0.0 0.0; } - min: 3 0; + min: 6 0; align: 0.0 0.5; color: COLOR_ITEM_FOCUS; fixed: 1 0; @@ -196,7 +196,7 @@ group { to: "elm.bg.text"; relative: 1.0 0.0; } - min: 3 0; + min: 6 0; align: 1.0 0.5; color: COLOR_ITEM_FOCUS; fixed: 1 0; @@ -489,8 +489,16 @@ group { type: SWALLOW; description { state: "default" 0.0; - rel1.to: "defaultbg"; - rel2.to: "defaultbg"; + rel1 { + to: "defaultbg"; + relative: 0.5 0.5; + } + rel2 { + to: "defaultbg"; + relative: 0.5 0.5; + } + min: 80 80; + fixed: 1 1; } } part { @@ -505,7 +513,7 @@ group { to: "bg"; relative: 1.0 0.0; } - min: 0 3; + min: 0 6; align: 0.5 0.0; color: COLOR_ITEM_FOCUS; fixed: 0 1; @@ -543,7 +551,7 @@ group { to: "bg"; relative: 0.0 1.0; } - min: 3 0; + min: 6 0; align: 0.0 0.5; color: COLOR_ITEM_FOCUS; fixed: 1 0; @@ -578,7 +586,7 @@ group { relative: 1.0 1.0; } rel2.to: "bg"; - min: 3 0; + min: 6 0; align: 1.0 0.5; color: COLOR_ITEM_FOCUS; fixed: 1 0; @@ -616,7 +624,7 @@ group { to: "part_focus3"; relative: 0.0 1.0; } - min: 0 3; + min: 0 6; align: 0.5 1.0; color: COLOR_ITEM_FOCUS; fixed: 0 1; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 85df1b1..9dd4c73 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -15,20 +15,130 @@ */ #include +#include #include +#include +#include #include #include "define.h" +#include "data/mediadata.h" +#include "util/listmgr.h" +#include "util/util.h" + +#define LIST_MEDIA_COND "media_type=0 OR media_type=1" + +#define TEXT_NOCONTENT "No Photo & Video" + +#define GRID_ITEM_X 206 +#define GRID_ITEM_Y 206 +#define GRID_NUM_ITEM 3 + +#define BOX_PADDING 62 struct _priv { Evas_Object *base; Evas_Object *layout; layoutmgr *lmgr; + + struct listmgr *listmgr; + + struct mediadata *md; + + Eina_List *media_list; +}; + +static Evas_Object *_grid_content_get(void *data, + Evas_Object *obj, const char *part) +{ + Evas_Object *image; + app_media *am; + app_media_info *info; + + if (!data) + return NULL; + + am = data; + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get media info"); + return NULL; + } + + image = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) { + image = util_add_image(obj, info->thumbnail_path); + if (!image) { + _ERR("failed to create image object"); + return NULL; + } + + evas_object_show(image); + } else if (!strcmp(part, PART_ELM_SWALLOW_VIDEO)) { + if (info->media_type == MEDIA_CONTENT_TYPE_VIDEO) { + image = util_add_image(obj, IMAGE_THUMBNAIL_PLAY); + if (!image) { + _ERR("failed to create image object"); + return NULL; + } + + evas_object_show(image); + } + } + + return image; +} + +static struct grid_class _gclass = { + .item_style = STYLE_GRID_GALLERY_ITEM, + .content_get = _grid_content_get }; +static struct listmgr_data *_create_listmgr_data(void) +{ + struct listmgr_data *data; + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("failed to allocate listmgr data"); + return NULL; + } + + data->grid_item_x = GRID_ITEM_X; + data->grid_item_y = GRID_ITEM_Y; + data->grid_num_item = GRID_NUM_ITEM; + data->box_padding = BOX_PADDING; + data->gclass = &_gclass; + + return data; +} + +static void _update_list_area(struct _priv *priv) +{ + Eina_List *list; + + if (priv->media_list) + return; + + list = mediadata_get_list(priv->md, E_LIST_DATE); + if (!list) { + elm_object_part_text_set(priv->layout, + PART_NOCONTENT, TEXT_NOCONTENT); + return; + } + + if (!listmgr_update_list_area(priv->listmgr, list)) + _ERR("failed to update list area"); + + priv->media_list = list; +} + static bool _create(layoutmgr *lmgr, void *data) { + struct listmgr *listmgr; + struct listmgr_data *ldata; + struct mediadata *md; struct _priv *priv; Evas_Object *base, *layout; @@ -46,30 +156,63 @@ static bool _create(layoutmgr *lmgr, void *data) base = layoutmgr_get_base(lmgr); if (!base) { _ERR("failed to get base object"); - free(priv); - return false; + goto err; } layout = elm_layout_add(base); if (!layout) { _ERR("failed to create layout"); - free(priv); - return false; + goto err; } if (!elm_layout_file_set(layout, EDJEFILE, GRP_GALLERY_LAYOUT)) { _ERR("failed to set layout file"); - evas_object_del(layout); - free(priv); + goto err2; + } + + ldata = _create_listmgr_data(); + if (!ldata) { + _ERR("failed to create listmgr data"); + goto err2; + } + + listmgr = listmgr_create(layout, (void *)ldata); + if (!listmgr) { + _ERR("failed to create listmgr"); + goto err3; + } + + md = mediadata_create(LIST_MEDIA_COND, E_SOURCE_ALL, E_SORT_DATE); + if (!md) { + _ERR("failed to create mediadata"); + listmgr_destroy(listmgr); + goto err3; } priv->base = base; priv->layout = layout; priv->lmgr = lmgr; + priv->listmgr = listmgr; + priv->md = md; layoutmgr_set_layout_data(lmgr, LAYOUT_GALLERY, priv); + if (!listmgr_draw_list_area(listmgr)) { + _ERR("failed to draw list area"); + mediadata_destroy(md); + listmgr_destroy(listmgr); + goto err3; + } + return true; + +err3: + free(ldata); +err2: + evas_object_del(layout); +err: + free(priv); + return false; } static void _destroy(void *layout_data) @@ -83,6 +226,11 @@ static void _destroy(void *layout_data) priv = layout_data; + mediadata_free_list(priv->media_list); + mediadata_destroy(priv->md); + + listmgr_destroy(priv->listmgr); + evas_object_del(priv->layout); free(priv); } @@ -120,6 +268,16 @@ static void _hide(void *layout_data) static void _update(void *layout_data, int update_type, void *data) { + struct _priv *priv; + + if (!layout_data) { + _ERR("failed to get layout data"); + return; + } + + priv = layout_data; + + _update_list_area(priv); } static layout_class _lclass = { diff --git a/src/layout/movie.c b/src/layout/movie.c index af6855a..326de60 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -24,6 +24,7 @@ #include "define.h" #include "data/mediadata.h" #include "util/listmgr.h" +#include "util/util.h" #define LIST_MEDIA_COND "media_type=1 AND copyright NOT LIKE \"Unknown\"" @@ -84,13 +85,8 @@ static Evas_Object *_grid_content_get(void *data, am = data; + image = NULL; if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) { - image = elm_image_add(obj); - if (!image) { - _ERR("failed to create image object"); - return NULL; - } - info = app_media_get_info(am); if (!info) { _ERR("failed to get media info"); @@ -98,15 +94,16 @@ static Evas_Object *_grid_content_get(void *data, return NULL; } - elm_image_file_set(image, info->thumbnail_path, NULL); - elm_image_aspect_fixed_set(image, EINA_FALSE); + image = util_add_image(obj, info->thumbnail_path); + if (!image) { + _ERR("failed to create image object"); + return NULL; + } evas_object_show(image); - - return image; } - return NULL; + return image; } static struct grid_class _gclass = { diff --git a/src/util/util.c b/src/util/util.c index df8abad..e89555a 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -69,6 +69,25 @@ Evas_Object *util_add_gengrid(Evas_Object *base, return grid; } +Evas_Object *util_add_image(Evas_Object *base, const char *file) +{ + Evas_Object *image; + + if (!base || !file) + return NULL; + + image = elm_image_add(base); + if (!image) { + _ERR("failed to create image object"); + return NULL; + } + + elm_image_file_set(image, file, NULL); + elm_image_aspect_fixed_set(image, EINA_FALSE); + + return image; +} + Evas_Object *util_add_scroller(Evas_Object *base) { Evas_Object *scr; diff --git a/src/view/base.c b/src/view/base.c index 07247de..7185c77 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -140,7 +140,7 @@ static bool _draw_menu_btn(struct _priv *priv) return false; } - elm_object_style_set(btn, STYLE_MENU_BTN); + elm_object_style_set(btn, STYLE_BTN_MENU); elm_object_text_set(btn, g_menu_item[i].name); elm_box_pack_end(box, btn); -- 2.7.4 From 430f34d012b6a39508696489a2d00e0094d46f15 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 7 Jul 2015 15:31:41 +0900 Subject: [PATCH 08/16] add progressbar including slider and info of progress time the progressbar is including slider widget and progress time texts. timer and progress info codes are moved to progressbar. Change-Id: Id557c4996a8cfdde2ed6a457b209bcd0511fb135 Signed-off-by: Minkyu Kang --- CMakeLists.txt | 1 + include/define.h | 3 +- include/util/progressbar.h | 44 ++++++++ include/util/util.h | 3 + include/view/viewer.h | 4 + res/edc/mediahub-theme.edc | 1 + res/edc/view/viewer.edc | 27 +++++ res/edc/widgets/button.edc | 10 +- res/edc/widgets/slider.edc | 225 +++++++++++++++++++++++++++++++++++++++ src/util/progressbar.c | 258 +++++++++++++++++++++++++++++++++++++++++++++ src/util/util.c | 18 ++++ src/view/viewer.c | 187 +++++++++++++------------------- 12 files changed, 662 insertions(+), 119 deletions(-) create mode 100644 include/util/progressbar.h create mode 100644 res/edc/widgets/slider.edc create mode 100644 src/util/progressbar.c diff --git a/CMakeLists.txt b/CMakeLists.txt index cba373b..08e5efd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,7 @@ src/util/listmgr.c src/util/timeout_handler.c src/util/util.c src/util/playermgr.c +src/util/progressbar.c src/data/mediadata.c ) diff --git a/include/define.h b/include/define.h index 6ecf61b..1b4651b 100644 --- a/include/define.h +++ b/include/define.h @@ -41,11 +41,10 @@ #define COLOR_TEXT_FOCUS 255 255 255 255 #define COLOR_TEXT_SELECTED 64 136 211 255 #define COLOR_TEXT_DISABLED 87 87 87 128 -#define COLOR_BTN_FOCUS 0 119 246 255 -#define COLOR_BTN_SELECTED 64 136 211 255 #define COLOR_ITEM_BG 56 55 59 255 #define COLOR_ITEM_FOCUS 0 119 246 255 #define COLOR_ITEM_FOCUS_0 0 119 246 0 +#define COLOR_ITEM_SELECTED 64 136 211 255 /* part */ #define PART_ELM_TEXT_TITLE "elm.text.title" diff --git a/include/util/progressbar.h b/include/util/progressbar.h new file mode 100644 index 0000000..c93a87e --- /dev/null +++ b/include/util/progressbar.h @@ -0,0 +1,44 @@ +/* + * 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_PROGRESSBAR_H__ +#define __AIR_MEDIAHUB_PROGRESSBAR_H__ + +struct progressbar; + +struct progressbar_ops { + int (*get_value)(void *data); + int (*set_value)(void *data); +}; + +struct progressbar *progressbar_create(Evas_Object *base); +void progressbar_destroy(struct progressbar *m); + +void progressbar_set_parts(struct progressbar *m, const char *slider, + const char *total, const char *progress, const char *separator); +void progressbar_set_ops(struct progressbar *m, + struct progressbar_ops *ops, void *data); +void progressbar_reset(struct progressbar *m, int position, int duration); + +void progressbar_show(struct progressbar *m); +void progressbar_hide(struct progressbar *m); + +void progressbar_start(struct progressbar *m); +void progressbar_stop(struct progressbar *m); +void progressbar_pause(struct progressbar *m); +void progressbar_resume(struct progressbar *m); + +#endif diff --git a/include/util/util.h b/include/util/util.h index 59aefce..0d624af 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -22,4 +22,7 @@ Evas_Object *util_add_gengrid(Evas_Object *base, int item_size_x, int item_size_y); Evas_Object *util_add_scroller(Evas_Object *base); +void util_time_string(char *str, int size, unsigned int ms); +void util_up_string(char *str); + #endif /* __AIR_MEDIAHUB_UTIL_H__ */ diff --git a/include/view/viewer.h b/include/view/viewer.h index b7622f2..580e287 100644 --- a/include/view/viewer.h +++ b/include/view/viewer.h @@ -23,6 +23,9 @@ /* group */ #define GRP_VIEWER_VIEW "group.viewer_view" +/* style */ +#define STYLE_VIEWER_PROGRESS "viewer_progress" + /* part */ #define PART_VIEWER_BG "part.viewer_bg" #define PART_VIEWER_CONTENT "part.viewer_content" @@ -32,6 +35,7 @@ #define PART_VIEWER_PROGRESS "part.viewer_progress" #define PART_VIEWER_TOTAL "part.viewer_total" #define PART_VIEWER_FAVORITE "part.viewer_favorite" +#define PART_VIEWER_SLIDER "part.viewer_slider" /* signal */ #define SIG_SET_PLAY "set,play,icon" diff --git a/res/edc/mediahub-theme.edc b/res/edc/mediahub-theme.edc index 4187a48..4eb7b88 100644 --- a/res/edc/mediahub-theme.edc +++ b/res/edc/mediahub-theme.edc @@ -19,4 +19,5 @@ collections { #include "widgets/button.edc" #include "widgets/gengrid.edc" + #include "widgets/slider.edc" } diff --git a/res/edc/view/viewer.edc b/res/edc/view/viewer.edc index e698125..bf7bb02 100644 --- a/res/edc/view/viewer.edc +++ b/res/edc/view/viewer.edc @@ -442,6 +442,31 @@ group { align: 0.0 0.5; } } + part { + name: PART_VIEWER_SLIDER; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 0 4; + rel1 { + to: "bottomarea"; + relative: 0.0 0.0; + } + rel2 { + to: "bottomarea"; + relative: 1.0 0.0; + } + fixed: 0 1; + align: 0.0 1.0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + align: 0.0 0.0; + visible: 0; + } + } } programs { @@ -452,6 +477,7 @@ group { action: STATE_SET "hide" 0.0; target: "toparea"; target: "bottomarea"; + target: PART_VIEWER_SLIDER; transition: LINEAR TRANSITION_TIME; } program { @@ -461,6 +487,7 @@ group { action: STATE_SET "default" 0.0; target: "toparea"; target: "bottomarea"; + target: PART_VIEWER_SLIDER; transition: LINEAR TRANSITION_TIME; after: SIG_SHOWED_BAR; } diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 98bff76..27bbf34 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -33,7 +33,7 @@ group { description { state: "focused" 0.0; inherit: "default" 0.0; - color: COLOR_BTN_FOCUS; + color: COLOR_ITEM_FOCUS; } description { state: "selected" 0.0; @@ -97,7 +97,7 @@ group { description { state: "selected" 0.0; inherit: "default" 0.0; - color: COLOR_BTN_SELECTED; + color: COLOR_ITEM_SELECTED; } } } @@ -142,7 +142,7 @@ group { description { state: "focused" 0.0; inherit: "default" 0.0; - color: COLOR_BTN_FOCUS; + color: COLOR_ITEM_FOCUS; } } part { @@ -191,7 +191,7 @@ group { } description { state: "selected" 0.0; - color: COLOR_BTN_FOCUS; + color: COLOR_ITEM_FOCUS; } } part { @@ -441,7 +441,7 @@ group { } description { state: "selected_pause" 0.0; - color: COLOR_BTN_FOCUS; + color: COLOR_ITEM_FOCUS; } } part { diff --git a/res/edc/widgets/slider.edc b/res/edc/widgets/slider.edc new file mode 100644 index 0000000..2e0e34c --- /dev/null +++ b/res/edc/widgets/slider.edc @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "elm/slider/horizontal/viewer_progress"; + data.item: "focus_highlight" "on"; + parts { + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + min: 0 4; + fixed: 0 1; + color: 0 0 0 0; + } + } + part { + name: "base"; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 1.0; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + min: 0 4; + fixed: 0 1; + align: 0.0 1.0; + color: 255 255 255 255; + } + } + part { + name: "glow"; + mouse_events: 0; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + rel1.to: "base"; + rel2 { + relative: 0.5 1.0; + to_x: "button"; + to_y: "base"; + } + min: 0 4; + max: 99999 4; + fixed: 0 1; + align: 0.0 1.0; + color: COLOR_ITEM_SELECTED; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: COLOR_ITEM_FOCUS; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "pad.align"; + type: SPACER; + mouse_events: 0; + description { + state: "default" 0.0; + fixed: 1 1; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + align: 0.0 1.0; + min: 0 0; + max: 0 0; + } + } + part { + name: "clip"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 255 255 255 0; + min: 0 0; + max: 0 0; + fixed: 1 1; + rel1 { + to: "elm.dragable.slider"; + to_y: "bg"; + } + rel2 { + to: "elm.dragable.slider"; + to_y: "bg"; + } + visible: 0; + } + } + part { + name: "button"; + type: GROUP; + mouse_events: 1; + source: "elm/slider/horizontal/progress_indicator/default"; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { + to: "elm.dragable.slider"; + to_y: "bg"; + } + rel2 { + to: "elm.dragable.slider"; + to_y: "bg"; + } + align: 0.0 0.5; + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "elm.swallow.bar"; + type: SWALLOW; + repeat_events: 1; + description { + state: "default" 0.0; + rel1.to_y: "bg"; + rel2.to_y: "bg"; + fixed: 1 1; + min: 0 0; + } + } + part { + name: "elm.dragable.slider"; + type: RECT; + mouse_events: 0; + scale: 1; + dragable.x: 1 1 0; + dragable.y: 0 0 0; + dragable.confine: "bg"; + description { + state: "default" 0.0; + min: 1 4; + max: 1 4; + rel1 { + to_x: "bg"; + relative: 0 0.5; + } + rel2 { + to_x: "bg"; + relative: 1 0.5; + } + color: 0 0 0 0; + fixed: 1 1; + align: 0.0 1.0; + } + } + part { + name: "slideevent"; + type: RECT; + mouse_events: 0; + scale: 1; + dragable.events: "elm.dragable.slider"; + description { + state: "default" 0.0; + fixed: 1 1; + min: 1 4; + max: 1 4; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + color: 0 0 0 0; + } + } + } +} + +group { + name: "elm/slider/horizontal/progress_indicator/default"; + alias: "elm/slider/horizontal/popup/default"; + parts { + part { + name: "knob_fill"; + repeat_events: 1; + scale: 1; + description { + state: "default" 0.0; + min: 1 4; + align: 0.5 0.5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "knob"; + repeat_events: 1; + scale: 1; + description { + state: "default" 0.0; + min: 1 4; + fixed: 1 1; + align: 0.0 1.0; + visible: 0; + } + } + } +} diff --git a/src/util/progressbar.c b/src/util/progressbar.c new file mode 100644 index 0000000..853b507 --- /dev/null +++ b/src/util/progressbar.c @@ -0,0 +1,258 @@ +/* + * 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 "define.h" +#include "util/progressbar.h" +#include "util/util.h" + +#define SLIDER_DEFAULT 0.05 +#define SLIDER_STEP 0.03 + +#define PROGRESSBAR_INTERVAL 0.1 + +struct progressbar { + Evas_Object *base; + Evas_Object *slider; + Ecore_Timer *timer; + + struct progressbar_ops *ops; + void *ops_data; + + char *part_slider; + char *part_total; + char *part_progress; + char *str_separator; +}; + +static void _update_progress_info(struct progressbar *m, int position) +{ + char progress[32] = {0,}; + + util_time_string(progress, sizeof(progress), position); + elm_object_part_text_set(m->base, m->part_progress, progress); +} + +static void _update_time_info(struct progressbar *m, int position, int duration) +{ + char str[32] = {0,}; + char total[32] = {0,}; + + util_time_string(str, sizeof(str), duration); + snprintf(total, sizeof(total), "%s%s", m->str_separator, str); + + elm_object_part_text_set(m->base, m->part_total, total); + + _update_progress_info(m, position); +} + +static Eina_Bool _timer_cb(void *data) +{ + struct progressbar *m; + int position; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + m = data; + + position = m->ops->get_value(m->ops_data); + + elm_slider_value_set(m->slider, position); + _update_progress_info(m, position); + + return ECORE_CALLBACK_RENEW; +} + +void progressbar_start(struct progressbar *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + if (m->timer) + ecore_timer_reset(m->timer); + else + m->timer = ecore_timer_add(PROGRESSBAR_INTERVAL, _timer_cb, m); +} + +void progressbar_stop(struct progressbar *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + ecore_timer_del(m->timer); + m->timer = NULL; +} + +void progressbar_pause(struct progressbar *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + if (m->timer) + ecore_timer_freeze(m->timer); +} + +void progressbar_resume(struct progressbar *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + if (m->timer) + ecore_timer_thaw(m->timer); +} + +void progressbar_show(struct progressbar *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + if (!m->part_slider || !m->slider) { + _ERR("slider did not initialize"); + return; + } + + evas_object_show(m->slider); + elm_object_part_content_set(m->base, m->part_slider, m->slider); +} + +void progressbar_hide(struct progressbar *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + if (!m->part_slider) { + _ERR("slider did not initialize"); + return; + } + + evas_object_hide(m->slider); + elm_object_part_content_unset(m->base, m->part_slider); +} + +void progressbar_reset(struct progressbar *m, int position, int duration) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + progressbar_stop(m); + + elm_slider_value_set(m->slider, position); + elm_slider_min_max_set(m->slider, 0, duration); + elm_slider_step_set(m->slider, SLIDER_STEP); + + _update_time_info(m, position, duration); +} + +void progressbar_set_ops(struct progressbar *m, + struct progressbar_ops *ops, void *data) +{ + if (!m || !ops) { + _ERR("invalid parameter"); + return; + } + + m->ops = ops; + m->ops_data = data; +} + +void progressbar_set_parts(struct progressbar *m, const char *slider, + const char *total, const char *progress, const char *separator) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + if (slider) + m->part_slider = strdup(slider); + + if (total) + m->part_total = strdup(total); + + if (progress) + m->part_progress = strdup(progress); + + if (separator) + m->str_separator = strdup(separator); +} + +struct progressbar *progressbar_create(Evas_Object *base) +{ + struct progressbar *m; + Evas_Object *obj; + + m = calloc(1, sizeof(*m)); + if (!m) { + _ERR("failed to allocate"); + return NULL; + } + + obj = elm_slider_add(base); + if (!obj) { + _ERR("failed to adding slider"); + free(m); + return NULL; + } + + elm_slider_indicator_show_set(obj, EINA_FALSE); + elm_slider_indicator_show_on_focus_set(obj, EINA_FALSE); + elm_object_style_set(obj, STYLE_VIEWER_PROGRESS); + elm_slider_horizontal_set(obj, EINA_TRUE); + elm_slider_step_set(obj, SLIDER_DEFAULT); + + /* FIXME: focus disabled */ + elm_object_focus_allow_set(obj, EINA_FALSE); + + m->base = base; + m->slider = obj; + + return m; +} + +void progressbar_destroy(struct progressbar *m) +{ + if (!m) { + _ERR("invalid parameter"); + return; + } + + progressbar_stop(m); + + free(m->part_slider); + free(m->part_total); + free(m->part_progress); + free(m->str_separator); + + free(m); +} diff --git a/src/util/util.c b/src/util/util.c index df8abad..5289fe4 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -87,3 +87,21 @@ Evas_Object *util_add_scroller(Evas_Object *base) return scr; } + +void util_time_string(char *str, int size, unsigned int ms) +{ + int sec; + + sec = ms / 1000; + + snprintf(str, size, "%02d:%02d:%02d", + sec / 3600, (sec % 3600) / 60, sec % 60); +} + +void util_up_string(char *str) +{ + while (*str) { + *str = toupper(*str); + str++; + } +} diff --git a/src/view/viewer.c b/src/view/viewer.c index 898aa07..8ee87bb 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -27,6 +27,7 @@ #include "util/controller.h" #include "util/timeout_handler.h" #include "util/playermgr.h" +#include "util/progressbar.h" #include "util/util.h" #define STYLE_VIEWER_BTN "viewer_btn" @@ -34,8 +35,7 @@ #define PLAY_BTN_LOC 2 #define VIEWER_TIMEOUT 3.0 -#define VIEWER_INTERVAL 0.1 - +#define VIEWER_SEPARATOR "/ " #define VIDEO_COPYRIGHT "Unknown" enum { @@ -67,12 +67,12 @@ struct _priv { Evas_Object *photo; Evas_Object *photo_pre; Evas_Object *favorite; - Evas_Object *timer; struct _viewer viewer; struct _playlist playlist; struct timeout_handler *timeout; struct playermgr *player; + struct progressbar *progress; bool bar_show; }; @@ -238,24 +238,6 @@ static inline bool _check_movie_type(app_media_info *mi) return strcmp(mi->video->copyright, VIDEO_COPYRIGHT); } -static void _time_string(char *str, int size, unsigned int ms) -{ - int sec; - - sec = ms / 1000; - - snprintf(str, size, "%02d:%02d:%02d", - sec / 3600, (sec % 3600) / 60, sec % 60); -} - -static void _up_string(char *str) -{ - while (*str) { - *str = toupper(*str); - str++; - } -} - static void _set_bg_color(struct _priv *priv, int r, int g, int b, int a) { Evas_Object *bg; @@ -408,7 +390,7 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) strftime(date, sizeof(date), "%d %b", &tm); strftime(day, sizeof(day), "%a", &tm); - _up_string(day); + util_up_string(day); snprintf(buf, sizeof(buf), "%s, %s", day, date); @@ -420,28 +402,19 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) } } -static void _draw_time_info(struct _priv *priv, int id, app_media_info *mi) +static void _draw_progressbar(struct _priv *priv, int id, app_media_info *mi) { - char progress[32] = {0,}; - char duration[32] = {0,}; - char total[32] = {0,}; + if (id == VIEWER_PHOTO) { + elm_object_part_text_set(priv->base, PART_VIEWER_PROGRESS, ""); + elm_object_part_text_set(priv->base, PART_VIEWER_TOTAL, ""); + progressbar_hide(priv->progress); - if (id != VIEWER_PHOTO) { - _time_string(progress, sizeof(progress), mi->video->position); - _time_string(duration, sizeof(duration), mi->video->duration); - snprintf(total, sizeof(total), "/ %s", duration); + return; } - elm_object_part_text_set(priv->base, PART_VIEWER_PROGRESS, progress); - elm_object_part_text_set(priv->base, PART_VIEWER_TOTAL, total); -} - -static void _draw_progress_info(struct _priv *priv, int ms) -{ - char progress[32] = {0,}; - - _time_string(progress, sizeof(progress), ms); - elm_object_part_text_set(priv->base, PART_VIEWER_PROGRESS, progress); + progressbar_reset(priv->progress, + mi->video->position, mi->video->duration); + progressbar_show(priv->progress); } static void _draw_favorite_icon(struct _priv *priv, int id, app_media_info *mi) @@ -528,7 +501,7 @@ static bool _viewer_show(struct _priv *priv, int foc) _draw_contents(priv, id, mi); _draw_title_bar(priv, id, mi); - _draw_time_info(priv, id, mi); + _draw_progressbar(priv, id, mi); _draw_favorite_icon(priv, id, mi); return true; @@ -577,6 +550,8 @@ static void _viewer_delete(struct _priv *priv) for (i = 0; i < VIEWER_MAX; i++) controller_destroy(priv->viewer.ctl[i]); + + progressbar_destroy(priv->progress); } static bool _viewer_prev(struct _priv *priv) @@ -655,64 +630,21 @@ static void _event_cb(void *data, int type, void *ei) _show_bar(data); } -static bool _ui_init(struct _priv *priv) -{ - Evas_Object *obj; - bool r; - int i; - - for (i = 0; i < VIEWER_MAX; i++) { - r = _viewer_add(priv, i); - if (!r) - goto err; - } - - obj = elm_image_add(priv->base); - if (!obj) { - _ERR("failed to adding image"); - goto err; - } - - elm_image_file_set(obj, IMAGE_VIEWER_FAVORITE, NULL); - priv->favorite = obj; - - priv->timeout = timeout_handler_init(VIEWER_TIMEOUT, - _timeout_cb, priv, - _event_cb, priv); - - priv->bar_show = true; - - return true; - -err: - _viewer_delete(priv); - return false; -} - -static Eina_Bool _timer_cb(void *data) +static int _player_get_position(void *data) { struct _priv *priv; - int ms; if (!data) - return ECORE_CALLBACK_CANCEL; + return 0; priv = data; - ms = playermgr_get_position(priv->player); - - _draw_progress_info(priv, ms); - - return ECORE_CALLBACK_RENEW; + return playermgr_get_position(priv->player); } -static void _timer_reset(struct _priv *priv) -{ - if (priv->timer) - ecore_timer_reset(priv->timer); - else - priv->timer = ecore_timer_add(VIEWER_INTERVAL, _timer_cb, priv); -} +struct progressbar_ops _progressbar_ops = { + .get_value = _player_get_position, +}; static void _player_play(struct _priv *priv) { @@ -723,15 +655,11 @@ static void _player_play(struct _priv *priv) switch (state) { case PLAYER_STATE_PAUSED: - if (priv->timer) - ecore_timer_thaw(priv->timer); - + progressbar_resume(priv->progress); playermgr_resume(priv->player); break; case PLAYER_STATE_PLAYING: - if (priv->timer) - ecore_timer_freeze(priv->timer); - + progressbar_pause(priv->progress); playermgr_pause(priv->player); break; case PLAYER_STATE_IDLE: @@ -743,8 +671,8 @@ static void _player_play(struct _priv *priv) } _remove_thumbnail(priv); - _timer_reset(priv); + progressbar_start(priv->progress); playermgr_play(priv->player, mi->file_path); break; @@ -758,9 +686,7 @@ static void _player_stop(struct _priv *priv) { struct controller *ctl; - ecore_timer_del(priv->timer); - priv->timer = NULL; - + progressbar_stop(priv->progress); playermgr_stop(priv->player); ctl = priv->viewer.ctl[priv->viewer.cur]; @@ -776,30 +702,23 @@ static void _player_complete_cb(void *data) priv = data; - ecore_timer_del(priv->timer); - priv->timer = NULL; + progressbar_stop(priv->progress); } static void _player_set_position_cb(void *data) { struct _priv *priv; struct controller *ctl; - int ms; if (!data) return; priv = data; - ms = playermgr_get_position(priv->player); - _draw_progress_info(priv, ms); - /* FIXME: what will you do here? */ + progressbar_pause(priv->progress); playermgr_pause(priv->player); - if (priv->timer) - ecore_timer_freeze(priv->timer); - ctl = priv->viewer.ctl[priv->viewer.cur]; ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY); } @@ -861,6 +780,53 @@ static void _callback_video(void *data, const char *ev) } } +static bool _ui_init(struct _priv *priv) +{ + Evas_Object *obj; + struct progressbar *prog; + bool r; + int i; + + for (i = 0; i < VIEWER_MAX; i++) { + r = _viewer_add(priv, i); + if (!r) + goto err; + } + + prog = progressbar_create(priv->base); + if (!prog) { + _ERR("failed to adding progressbar"); + goto err; + } + + progressbar_set_parts(prog, PART_VIEWER_SLIDER, PART_VIEWER_TOTAL, + PART_VIEWER_PROGRESS, VIEWER_SEPARATOR); + progressbar_set_ops(prog, &_progressbar_ops, priv); + + priv->progress = prog; + + obj = elm_image_add(priv->base); + if (!obj) { + _ERR("failed to adding image"); + goto err; + } + + elm_image_file_set(obj, IMAGE_VIEWER_FAVORITE, NULL); + priv->favorite = obj; + + priv->timeout = timeout_handler_init(VIEWER_TIMEOUT, + _timeout_cb, priv, + _event_cb, priv); + + priv->bar_show = true; + + return true; + +err: + _viewer_delete(priv); + return false; +} + static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; @@ -982,9 +948,6 @@ static void _destroy(void *view_data) timeout_handler_fini(priv->timeout); - ecore_timer_del(priv->timer); - priv->timer = NULL; - playermgr_destroy(priv->player); evas_object_del(priv->base); -- 2.7.4 From 1eb953610bc1889fd7d698cba34bcec804dfef88 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 7 Jul 2015 16:04:24 +0900 Subject: [PATCH 09/16] add ic_thumbnail_play image file Change-Id: Ibcce38f2ef6bb42fcb092a288821f368c8bd563f Signed-off-by: Jehun Lim --- res/images/ic_thumbnail_play.png | Bin 0 -> 5710 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/images/ic_thumbnail_play.png diff --git a/res/images/ic_thumbnail_play.png b/res/images/ic_thumbnail_play.png new file mode 100644 index 0000000000000000000000000000000000000000..48030849023250dc8ed1a5ec41159f1421ecde6e GIT binary patch literal 5710 zcmbVQcQ~7E+m9`F?bS-PHCiM_jM%eisTf7gAP6EMw%WC7l&V#uwxaeZHA-!@DT<<~ zqE?M+Ykha0_j%s$`{O;{Kfe1&a*v$rIjd!QgbSQl3U!bhI>FS!Wd`p;u1FXS&04`+Gae;H+> zqX$vNxuYR)5piK#n5Za3Qc^@z0xl^jDg+UOiHbpCz(-P8R008)M2Ja2{yumCZSHpV z2z@n;zjXn3^1O~79(V*4>h0|<;w>(Mb9aD>%E-w4ks&4~3{VIYd|f?IKEkeqYyU`4 zLlbP>F?bIQ&K2@UBFYBm=^@VxSo*IeVDUOS{}${@_}fu{%b-3eJXBN!2E}6ktm`jo zf`>l(f6e%h)C5CcJQ}KxCg42XZGru;zxEF^;Jg2>=no-a4dR|V2G|soiyF?>6N`5B z&{C7<1^yAS!`LCzq+qIWakv;vT1{GALR3^*0;a5?t`3(_))1AEl2Q3b#((0Kf~%@& zz{TJ&bqTnrs5)FmSzSt9SrRTGp`i{_SC{#RSId>)fpWD)|DzWJ=>3~l;=l4DRNc`i z51hLp4(IYu1n4>9Ja7a@93G--APEsL#<<$yya|GTw&!1~RYSXDywG+U?l>&uFaIJi z|3SYB3y_03qeWHV;-V@ts(@9zfAiY?e|!c7jDh|Mj{g%Z|2zUB z@XzJHLm#;Lck-ZJfsAnnQe$#M?F@Gc?oul$?~zm$Ev!Aik7dd%`*}|g2g}PWb>ebl$#9j z@e&IQ$cDQZ4PGej3PYh}d4?=x0VBTEn{Bs0odoTkOnWcJDVv#b9aqlN(9pa&I*yQ+ z^Uai(R~!5qU*Kd*cjIh+DohBrb+w&A==+cDxuMXouzKZEt%u{w{aMU`I}p?>V19mnDkClJH2v_b zA~`iRm4%g+b+OsIQjVYhE9(CJsm{>Q&^HwHS0q^2*rYzgRU_%(4fXYKFAon1E?KWF zYoI(hQ&2>9>;Q~SyR(5#*i>45+e5}Jc@xg z#KgqPDk>@xDaT96r3>3v+=)ko^hvJA-ymwf`Kb!kxh}Q%@PNg-Bx7l*>HE@M20ci|=xg_WBe*$ffp|jsA69XL1)PmKvu~`mScj9YD?mcs2pXQ@9 zlO|#ycVZXJgFNkYoO)&2$;-=Iq>~2g$e6co3t@vo1qDs%`IgwzBlTfx1UOQvgQ?P@ zd5V$!==gJIB#(8+`$$RuA6uGMR*PpK%PSrq+L6>05!|#dhwu{Mv>A>Bm(yZM(1c20 ze&VUUJV!oxZ&$S&oiy8TRq5NAw+4NAhO-bHSz-yLTm4D=pUzHC<5f=Av_?9*HuLiH znUs<%#2|2L_TuuHex-KJ!*@M+P4BIl&&^IBO54vz*SnXh(QG2-l-UXaev$-|dTI#K z$lh$da}c+<{otj>{Ha53A3ak&Jw2iMz1yU6r8QLWSL04U`yU}0i3=wC`!UukD(~Kn z<=^%fyLq~IiG4^s8=@~SE>{;Jg@;xt7rwls9OwNn736_YkiM-0O!$uYph#6)5>-#6BF9W&(_9;YvTH#ppNG4NztyRUmlfa$787TM;*+_FufO=6!G zVJ&U#eNcvXY$ye?jeEKLf_Tq;sm%O|$ux`Pa$HK-$9@ft_T3Nqe0j0`{r&lGHnY?% zh@f(E^8<^EimcobEXcVY^!tvLbcNeDLt^TXl1L3VOXwb{x)5?SnE7pahKSVX$9?XB%BO-go+oOQQL*K{j|9O z>XT*ddk_z-M~L6WNKT5RWTJ0qC?F{`QkajA?@D{Ku8Sp(?1>ms+0IcZ9l~-JolTk^ zhWz0m!-8}urS|>C5S7J?xlqgzwrZ0rqz^8pQ~ULp<<@Xc?BVr+cy^DX0VkuhQdczk zi+4&&O2_rimjN4vspl!Fsm2;0myIt=;13+>_RE`_PDzQ0)nLXHBA>j{(#@#kWTVJZ zq0Qich_53rj>-1c#scxjV31`v#Bk$Qd0gLQlvv)YLsA>i#)2B-IlEj^$fE$h_C_m+ z-1ECsB))hD-gJoR$6k=#!FnJ*EoAUpW>%JkR*OF?JBOyky|Jq#;FIgd73Sabmr$SG zIwNR%(+*!jLwkFo1#FqrIC~w(SgL%sSNoHgCabG11H^Yb!Y`z)+k-b|C=!1ixvlgB zsLxFQJjvd9+yYBf+|%?o78&Fp zx`RsuV%``eP2lrCYBMEfrEpK@d5Pf(Wj@U=PD;1Icq9!43r$pHxjz5T3R0R zUom^_dSt&WOd_v`epb(czD*-=-=J96Vw@w`2KKCHsm5V~t`A)42$oaOeBIFC)niL7 zk+vR5SQ~V+wh3wqH;N-L^cJJQ3vMcuaR7#Wu6PKvBNL?aMPY*^at3v9djI6x9k2wz6+P&v} z_Lf32{X6u%*;FHbynL({k;JF-`}pwiurl!H=SZpc6Rjp!h1&HZVM7S{(%p&)T`4K4 z2jVUikPAnKrw)pKpTE3MMVp_vw@5CF)a%?#em;~X>#c=Ej){zhruz3O=(9Ey6coG! zk;WD=$O_mKF$+Ja>&vrx8+d4{%;m$)aZEfyDe)0PT@~rGmEY{W>l*m2{B>r3mnZo8 zz=GdWdx)6?pIR)#t;bnWvu~@aU_8H14}mI)#$YhXzZoTD5s3I`;CLic{#*?GIF9Zz zEsuFvSXsE^=NEO_;U;4;qs@XqgF4C!BJ*z1yVJ1S-AX6H!}9`DeD6hk=qt#~@bK_m z3YUV9TFxjG>eBXglM)bfB12D{B~aq@21W059SZ6sXkPC*KR>@nOiE%p`sBT+!xGc2 z@xV($j!vo6W>&dsnF-`ap`J6RxGcP!O{ESxaupLPFR%3JX(_cXKY^`(QN&fZg z7y6Le8Xg;8sE^{jKs5uMDt|#=0_5qw&_wv!07OXu0|SF~G1*C1zL5eu7!aQVt=!hD~GDRh)xCK=PXvq8on zr?8WZX0D1{DkQ-zv~YN?kLISgGhfpo>bFs;T8@sq=zyj$tUVJ;PQOv`@WZPcta;Y< zur(qqF;#@(M1TKAt?T`#G-t;4Kx_=qC0D5S5{d62BK0=NzD*9#-@+Ma}$i_kbj0V{TE>>h&7AY~+(CCQ+ zmi@xOz~BxTzlGRx_4j3COC=hNE6tS(pGBZ;ZC6w&87#E=?X7Xj6)#_|pYy+X$oMws z;+&fZ&uOtvih4@L)Lt4ptDaoz=;$a=U01gX#d~=*pyuCNmg3Q9G+BW=KhUNFuf-rT z`jn^52%OJldDe*d8tO=@-rU2{k?A3gjFNFU+=vyZVljK7l0u%FaLl!`ysWMnQs&wa_u_tX>wfc`AL*Gku7J({E3z{Ib+HU3-LLZVNV5EdHB3pDaJioGh4 z$UD(rVp}KdKWNIiulAi!O--q4w!Bh%wXVa2WFbGcx|aGLXD};b-Z)xYY-&P>1xjNO z1<4il1vqL^e60H>c;P%eBEoOXM%?;YoJolx`<)N?r?{ocyN#Kg!b_0`8b z_m-8jsu_&mW+OZ|->r}3Uo<@YwVwpCWI?qs>_s8uJZ|Gq@-JEqP9I_0O%AW&dhXUej`%(-S@Ca zC&N-hsEVXoId(=*tBZ0X^y<5_ljEcfXfQ0Pso2?Af;O9Ry!_qMr%!qNAZ;7~FqH!G zy{&VmsTYA~$f}`7zmOrU+0BN`Kr~!DZ>!10Y-&ApaoIv@--`;61G%vYS0zYsFnGIi zAw1TLkx1k;DP3Olw~wJBBMQ$hi{=pcX6npJavv;cw9w4T-NFZ6(7JN*KnM(y1tIeD z{gj0z;PGh#+QuI^>rGV-+GxXjJH7k6U^fM2Of*Vr!oD6z8cpW&PQ9>EiI>c&P!9YmS8 z+iy-mU4EjsqC-8P-JwbYiF(3Fx|{icTuf*civlY54yrSP>?vi7-@8X(p82+b=Fo4Q zF@x1EM{~Hh+Y;j9wUBHnqWz_}HbhbWQ@n($)YIi=uk#BF$-+#BCnqO~O*nek&)fPG zzDrm`0@&v(prV&hv!L8e(@gx8l=U!KmXXxqduLfELogMWOz7Bh?cmL5x1EBF}n53lS z4X;X0w0e3|@h<62*%;sKWOr18*~PD~FW&#yUA)Lv$z9^v&?+212j-*sH#Xf=uPrHg z>8}i5MuR9YTBXWy0@wQdVqWfu*H$|0q$^pqUnOcFV}B4-#e!7wwsr5l67+kcxVZs4 z=N0$uGW6>HzRN<3?iRtZ1pJ=V-l0A6q89c=6&AGxMS6{rmUpv&rTjCTwkNU=kA&_9|jxVoH@B zS1&BI`gbk{9DlkqpR`@FI#1ZTJn;p=vto!3c4FUKj^qh!jPi4Ek*>aFT(L!-FPA*= z#Q3#gM*io_3d`0v8D#Wp+4N#UYNqUK^3y%C(3T@6t>fSR{{C}ay}h`Q`R^lJo(bdw z3gf8(b_ax0!})fOhi`%+5TCOnEvV z(8OWe`{YeG9@7e{k=?fMD6b4>rGx$qL_C*o)RHOvh>MB_9x z$6cni_GjHwQ(pQMbY>-@Z6WZ6+7Bauw*fxZUj~vdZW|`=)O0CMk9M)<%+CB^ zH{z6%>G~vexjKr(>3|<(UuiA^9seQOCruuIG%UNDW5A`p21^_4Ph)b4naA!sx^daP z`JO9^#Mu=|+`Q>@`b^N^9Og0u~Ap_P}nbrzPa@|#fZr;FHNCYRD7L(fMbD(~;;5JT8v h@|)q#3#(uv(Dd`i2D)*Kf8G;=wA6LgDpagP{|BkSVrl>Y literal 0 HcmV?d00001 -- 2.7.4 From 1814c4e8d86c1245b452aa30bf14b06e035ebb16 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 8 Jul 2015 09:54:13 +0900 Subject: [PATCH 10/16] use content time instead of modified time when sorting list Change-Id: Ia41c816932c184250e03e541425cc6ad42bdd06f Signed-off-by: Minkyu Kang --- include/data/mediadata.h | 1 + src/data/mediadata.c | 72 ++++++++++++++++++++++++++++++++++-------------- src/view/viewer.c | 7 ++--- 3 files changed, 54 insertions(+), 26 deletions(-) diff --git a/include/data/mediadata.h b/include/data/mediadata.h index 557c85f..45fff25 100644 --- a/include/data/mediadata.h +++ b/include/data/mediadata.h @@ -43,6 +43,7 @@ enum list_type { struct group_info { char *name; Eina_List *list; + void *data; }; struct mediadata *mediadata_create(const char *media_type, diff --git a/src/data/mediadata.c b/src/data/mediadata.c index 16504bb..554c72f 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -22,6 +22,7 @@ #include "data/mediadata.h" typedef int (*media_compare)(struct group_info *gi, app_media_info *info); +typedef void *(*media_compare_data_get)(app_media_info *info); typedef char *(*group_name_get)(app_media_info *info); static int _compare_cb_date(const void *, const void *); @@ -29,8 +30,10 @@ static int _compare_cb_name(const void *, const void *); static int _compare_title(struct group_info *, app_media_info *); static char *_get_title(app_media_info *); -static int _compare_modified_time(struct group_info *, app_media_info *); -static char *_get_modified_time(app_media_info *); +static void *_get_data_title(app_media_info *info); +static int _compare_time(struct group_info *, app_media_info *); +static char *_get_time(app_media_info *); +static void *_get_data_time(app_media_info *info); enum _filter_type { E_FILTER_FOLDER = 0, @@ -59,6 +62,7 @@ struct _sort_info { struct _list_info { media_compare media_cmp; + media_compare_data_get data_get; group_name_get name_get; }; @@ -79,10 +83,12 @@ static struct _list_info g_list_info[E_LIST_MAX] = { [E_LIST_NAME] = { .media_cmp = _compare_title, .name_get = _get_title, + .data_get = _get_data_title, }, [E_LIST_DATE] = { - .media_cmp = _compare_modified_time, - .name_get = _get_modified_time, + .media_cmp = _compare_time, + .name_get = _get_time, + .data_get = _get_data_time, } }; @@ -121,23 +127,29 @@ static bool _create_filter(struct _data *data, filter_h *filter, int type) return true; } -static char *_get_date_string(time_t time) +static char *_get_date_string(struct tm *tm) { - struct tm tm; char buf[32]; - localtime_r(&time, &tm); - strftime(buf, sizeof(buf), "%Y.%m.%d", &tm); + strftime(buf, sizeof(buf), "%Y.%m.%d", tm); return strdup(buf); } static int _compare_title(struct group_info *gi, app_media_info *info) { - if (!gi || !gi->name || !info->title) + if (!gi || !gi->data || !info->title) return -1; - return strncasecmp(gi->name, info->title, 1); + return strncasecmp(gi->data, info->title, 1); +} + +static void *_get_data_title(app_media_info *info) +{ + if (!info->title) + return NULL; + + return strdup(info->title); } static char *_get_title(app_media_info *info) @@ -148,32 +160,45 @@ static char *_get_title(app_media_info *info) return strndup(info->title, 1); } -static int _compare_modified_time(struct group_info *gi, app_media_info *info) +static int _compare_time(struct group_info *gi, app_media_info *info) { - char *date; - int r; + struct tm *tm; - if (!gi || !gi->name) + if (!gi || !gi->data) return -1; - date = _get_date_string(info->modified_time); + tm = gi->data; - r = strcasecmp(gi->name, date); + if (tm->tm_year == info->content_time->tm_year && + tm->tm_yday == info->content_time->tm_yday) + return 0; - free(date); + return 1; +} - return r; +static void *_get_data_time(app_media_info *info) +{ + struct tm *tm; + + tm = calloc(1, sizeof(*tm)); + if (!tm) + return NULL; + + memcpy(tm, info->content_time, sizeof(*tm)); + + return tm; } -static char *_get_modified_time(app_media_info *info) +static char *_get_time(app_media_info *info) { - return _get_date_string(info->modified_time); + return _get_date_string(info->content_time); } static int _compare_cb_date(const void *data1, const void *data2) { app_media *am1, *am2; app_media_info *info1, *info2; + time_t tm1, tm2; am1 = (app_media *)data1; am2 = (app_media *)data2; @@ -184,7 +209,10 @@ static int _compare_cb_date(const void *data1, const void *data2) if (!info1 || !info2) return -1; - if (info1->modified_time < info2->modified_time) + tm1 = mktime(info1->content_time); + tm2 = mktime(info2->content_time); + + if (tm1 < tm2) return 1; return -1; @@ -429,6 +457,7 @@ Eina_List *mediadata_get_list(struct mediadata *md, int list_type) } gi->name = g_list_info[list_type].name_get(info); + gi->data = g_list_info[list_type].data_get(info); list = eina_list_append(list, gi); } @@ -446,6 +475,7 @@ void mediadata_free_list(Eina_List *list) EINA_LIST_FOREACH(list, l, gi) { free(gi->name); + free(gi->data); eina_list_free(gi->list); free(gi); diff --git a/src/view/viewer.c b/src/view/viewer.c index 8ee87bb..79f2e51 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -380,16 +380,13 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) char buf[32] = {0,}; char day[32] = {0,}; char date[32] = {0,}; - struct tm tm; if (id == VIEWER_MOVIE) { elm_object_part_text_set(priv->base, PART_VIEWER_TITLE, mi->title); } else { - localtime_r(&mi->modified_time, &tm); - - strftime(date, sizeof(date), "%d %b", &tm); - strftime(day, sizeof(day), "%a", &tm); + strftime(date, sizeof(date), "%d %b", mi->content_time); + strftime(day, sizeof(day), "%a", mi->content_time); util_up_string(day); snprintf(buf, sizeof(buf), "%s, %s", day, date); -- 2.7.4 From 34f2e7a8a4405c32624ca3c571004fd839e95fab Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 8 Jul 2015 16:11:16 +0900 Subject: [PATCH 11/16] listmgr: add callback functions for grid item : mouse move, realized, unrealized, selected Change-Id: If07433cafb4c94417350c6ec3bf355d28c38e6d1 Signed-off-by: Jehun Lim --- include/data/mediadata.h | 2 ++ include/define.h | 4 +++ include/util/listmgr.h | 3 +++ include/util/util.h | 2 ++ include/view.h | 12 +++++++++ res/edc/widgets/gengrid.edc | 44 ++++++++++++++++++++++++++++-- src/data/mediadata.c | 10 +++++++ src/layout/gallery.c | 42 +++++++++++++++++++++++++++-- src/layout/movie.c | 42 +++++++++++++++++++++++++++-- src/util/listmgr.c | 65 +++++++++++++++++++++++++++++++++++++++++++++ src/util/util.c | 17 ++++++++++++ 11 files changed, 237 insertions(+), 6 deletions(-) diff --git a/include/data/mediadata.h b/include/data/mediadata.h index 45fff25..c9f15c8 100644 --- a/include/data/mediadata.h +++ b/include/data/mediadata.h @@ -50,6 +50,8 @@ struct mediadata *mediadata_create(const char *media_type, int source_type, int sort_type); void mediadata_destroy(struct mediadata *md); +Eina_List *mediadata_get_medialist(struct mediadata *md); + Eina_List *mediadata_get_list(struct mediadata *md, int list_type); void mediadata_free_list(Eina_List *list); diff --git a/include/define.h b/include/define.h index 1b4651b..905eaea 100644 --- a/include/define.h +++ b/include/define.h @@ -52,4 +52,8 @@ #define PART_ELM_SWALLOW_THUMBNAIL "elm.swallow.thumbnail" #define PART_ELM_SWALLOW_VIDEO "elm.swallow.video" +/* signal */ +#define SIG_ITEM_SELECTED "item_selected" +#define SIG_SOURCE_EDC "edc" + #endif /* __AIR_MEDIAHUB_DEFINE_H__ */ diff --git a/include/util/listmgr.h b/include/util/listmgr.h index 4889e3d..ad0a8ce 100644 --- a/include/util/listmgr.h +++ b/include/util/listmgr.h @@ -27,6 +27,9 @@ struct listmgr_data { int box_padding; struct grid_class *gclass; + + void (*grid_selected_cb)(void *data, Elm_Object_Item *it); + void *cb_data; }; struct listmgr *listmgr_create(Evas_Object *base, void *data); diff --git a/include/util/util.h b/include/util/util.h index aebcb74..ee354f7 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -26,4 +26,6 @@ Evas_Object *util_add_scroller(Evas_Object *base); void util_time_string(char *str, int size, unsigned int ms); void util_up_string(char *str); +int util_get_media_index(Eina_List *list, void *info); + #endif /* __AIR_MEDIAHUB_UTIL_H__ */ diff --git a/include/view.h b/include/view.h index aabb6ae..afa40e8 100644 --- a/include/view.h +++ b/include/view.h @@ -23,4 +23,16 @@ view_class *view_base_get_vclass(void); /* viewer */ view_class *view_viewer_get_vclass(void); +/* view data */ +struct view_data { + Eina_List *list; + int index; +}; + +/* view update type */ +enum update_type { + UPDATE_CONTENT = 0, + UPDATE_FOCUS +}; + #endif /* __AIR_MEDIAHUB_VIEW_H__ */ diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 624f553..51b9e77 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -46,7 +46,7 @@ group { visible: 0; } description { - state: "clicked" 0.0; + state: "selected" 0.0; inherit: "default" 0.0; perspective.zplane: -100; } @@ -388,6 +388,26 @@ group { target: "part_focus3"; target: "elm.bg.text"; } + program { + name: "selected"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "after_selected"; + } + program { + name: "after_selected"; + action: STATE_SET "default" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "item_selected"; + } + program { + name: "item_selected"; + action: SIGNAL_EMIT SIG_ITEM_SELECTED SIG_SOURCE_EDC; + } } } @@ -423,7 +443,7 @@ group { visible: 0; } description { - state: "clicked" 0.0; + state: "selected" 0.0; inherit: "default" 0.0; perspective.zplane: -100; } @@ -732,5 +752,25 @@ group { target: "part_focus3"; target: "part_focus4"; } + program { + name: "selected"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "after_selected"; + } + program { + name: "after_selected"; + action: STATE_SET "default" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "item_selected"; + } + program { + name: "item_selected"; + action: SIGNAL_EMIT SIG_ITEM_SELECTED SIG_SOURCE_EDC; + } } } diff --git a/src/data/mediadata.c b/src/data/mediadata.c index 554c72f..ffb85ab 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -421,6 +421,16 @@ void mediadata_destroy(struct mediadata *md) eina_list_free(md->media_list); } +Eina_List *mediadata_get_medialist(struct mediadata *md) +{ + if (!md) { + _ERR("failed to get mediadata"); + return NULL; + } + + return md->media_list; +} + Eina_List *mediadata_get_list(struct mediadata *md, int list_type) { Eina_List *list, *l; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 9dd4c73..2c6f7fe 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -20,8 +20,10 @@ #include #include #include +#include #include "define.h" +#include "view.h" #include "data/mediadata.h" #include "util/listmgr.h" #include "util/util.h" @@ -95,7 +97,39 @@ static struct grid_class _gclass = { .content_get = _grid_content_get }; -static struct listmgr_data *_create_listmgr_data(void) +static void _grid_selected_cb(void *data, Elm_Object_Item *it) +{ + app_media *am; + struct view_data *vdata; + struct _priv *priv; + + if (!data || !it) { + _ERR("invalid argument"); + return; + } + + priv = data; + + am = elm_object_item_data_get(it); + if (!am) { + _ERR("failed to get app media"); + return; + } + + vdata = calloc(1, sizeof(*vdata)); + if (!vdata) { + _ERR("failed to allocate view data"); + return; + } + + vdata->list = mediadata_get_medialist(priv->md); + vdata->index = util_get_media_index(vdata->list, am); + + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, vdata); + viewmgr_push_view(VIEW_VIEWER); +} + +static struct listmgr_data *_create_listmgr_data(struct _priv *priv) { struct listmgr_data *data; @@ -109,8 +143,12 @@ static struct listmgr_data *_create_listmgr_data(void) data->grid_item_y = GRID_ITEM_Y; data->grid_num_item = GRID_NUM_ITEM; data->box_padding = BOX_PADDING; + data->gclass = &_gclass; + data->grid_selected_cb = _grid_selected_cb; + data->cb_data = priv; + return data; } @@ -170,7 +208,7 @@ static bool _create(layoutmgr *lmgr, void *data) goto err2; } - ldata = _create_listmgr_data(); + ldata = _create_listmgr_data(priv); if (!ldata) { _ERR("failed to create listmgr data"); goto err2; diff --git a/src/layout/movie.c b/src/layout/movie.c index 326de60..f0d1478 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -20,8 +20,10 @@ #include #include #include +#include #include "define.h" +#include "view.h" #include "data/mediadata.h" #include "util/listmgr.h" #include "util/util.h" @@ -112,7 +114,39 @@ static struct grid_class _gclass = { .content_get = _grid_content_get }; -static struct listmgr_data *_create_listmgr_data(void) +static void _grid_selected_cb(void *data, Elm_Object_Item *it) +{ + app_media *am; + struct view_data *vdata; + struct _priv *priv; + + if (!data || !it) { + _ERR("invalid argument"); + return; + } + + priv = data; + + am = elm_object_item_data_get(it); + if (!am) { + _ERR("failed to get app media"); + return; + } + + vdata = calloc(1, sizeof(*vdata)); + if (!vdata) { + _ERR("failed to allocate view data"); + return; + } + + vdata->list = mediadata_get_medialist(priv->md); + vdata->index = util_get_media_index(vdata->list, am); + + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, vdata); + viewmgr_push_view(VIEW_VIEWER); +} + +static struct listmgr_data *_create_listmgr_data(struct _priv *priv) { struct listmgr_data *data; @@ -126,8 +160,12 @@ static struct listmgr_data *_create_listmgr_data(void) data->grid_item_y = GRID_ITEM_Y; data->grid_num_item = GRID_NUM_ITEM; data->box_padding = BOX_PADDING; + data->gclass = &_gclass; + data->grid_selected_cb = _grid_selected_cb; + data->cb_data = priv; + return data; } @@ -187,7 +225,7 @@ static bool _create(layoutmgr *lmgr, void *data) goto err2; } - ldata = _create_listmgr_data(); + ldata = _create_listmgr_data(priv); if (!ldata) { _ERR("failed to create listmgr data"); goto err2; diff --git a/src/util/listmgr.c b/src/util/listmgr.c index b5ca603..a340e1f 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "define.h" #include "data/mediadata.h" @@ -31,6 +32,68 @@ struct listmgr { struct listmgr_data *data; }; +void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Mouse_Move *ev) +{ + Elm_Object_Item *it; + + if (!obj || !ev) + return; + + it = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL, NULL); + + if (!it) + return; + + if (elm_object_item_focus_get(it)) + return; + + elm_object_item_focus_set(it, EINA_TRUE); +} + +void _grid_selected_cb(void *data, Elm_Object_Item *it, + const char *emission, const char *source) +{ + struct listmgr *lmgr; + struct listmgr_data *ldata; + + if (!data || !it) + return; + + lmgr = data; + ldata = lmgr->data; + + if (ldata->grid_selected_cb) + ldata->grid_selected_cb(ldata->cb_data, it); +} + +void _grid_realized_cb(int id, void *data, Evas_Object *obj, + Elm_Object_Item *it) +{ + if (!data || !it) + return; + + elm_object_item_signal_callback_add(it, SIG_ITEM_SELECTED, + SIG_SOURCE_EDC, _grid_selected_cb, data); +} + +void _grid_unrealized_cb(int id, void *data, Evas_Object *obj, + Elm_Object_Item *it) +{ + if (!it) + return; + + elm_object_item_signal_callback_del(it, SIG_ITEM_SELECTED, + SIG_SOURCE_EDC, _grid_selected_cb); +} + +static input_handler grid_handler = { + .mouse_move = _mouse_move_cb, + .realized = _grid_realized_cb, + .unrealized = _grid_unrealized_cb +}; + static int _get_grid_size(int count, int num_item) { int size; @@ -86,6 +149,8 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) evas_object_size_hint_min_set(grid, size * data->grid_item_x, data->grid_num_item * data->grid_item_y); + inputmgr_add_callback(grid, 0, &grid_handler, lmgr); + elm_object_part_content_set(ly, PART_ITEM_TITLE, btn); elm_object_part_content_set(ly, PART_ITEM_CONTENT, grid); diff --git a/src/util/util.c b/src/util/util.c index 20ac818..ce88147 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -124,3 +124,20 @@ void util_up_string(char *str) str++; } } + +int util_get_media_index(Eina_List *list, void *data) +{ + Eina_List *l; + int index; + void *obj; + + index = 0; + EINA_LIST_FOREACH(list, l, obj) { + if (data == obj) + break; + + index++; + } + + return index; +} -- 2.7.4 From 6d092688475ec14bf4357ae32734098a6d5bae82 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 8 Jul 2015 16:46:52 +0900 Subject: [PATCH 12/16] gallery: add copyright condition for media list Change-Id: I4fe32eb972df44f331d255b166b21a820b1d6e84 Signed-off-by: Jehun Lim --- src/layout/gallery.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 2c6f7fe..939a86b 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -28,7 +28,8 @@ #include "util/listmgr.h" #include "util/util.h" -#define LIST_MEDIA_COND "media_type=0 OR media_type=1" +#define LIST_MEDIA_COND "(media_type=0 OR media_type=1) \ + AND copyright LIKE \"Unknown\"" #define TEXT_NOCONTENT "No Photo & Video" -- 2.7.4 From 3373ddc4e10198d6f322b258156e0c263427b5a4 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 8 Jul 2015 17:13:13 +0900 Subject: [PATCH 13/16] viewer: add update function for getting media list from base view Change-Id: I9f7aa2b87a36071e0eae410439070a3ea8dec3af Signed-off-by: Minkyu Kang --- include/view.h | 2 +- src/layout/gallery.c | 14 +++----- src/layout/movie.c | 14 +++----- src/view/viewer.c | 90 +++++++++++++++------------------------------------- 4 files changed, 34 insertions(+), 86 deletions(-) diff --git a/include/view.h b/include/view.h index afa40e8..18a07bf 100644 --- a/include/view.h +++ b/include/view.h @@ -24,7 +24,7 @@ view_class *view_base_get_vclass(void); view_class *view_viewer_get_vclass(void); /* view data */ -struct view_data { +struct view_update_data { Eina_List *list; int index; }; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 939a86b..ecac88b 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -101,7 +101,7 @@ static struct grid_class _gclass = { static void _grid_selected_cb(void *data, Elm_Object_Item *it) { app_media *am; - struct view_data *vdata; + struct view_update_data vdata; struct _priv *priv; if (!data || !it) { @@ -117,16 +117,10 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it) return; } - vdata = calloc(1, sizeof(*vdata)); - if (!vdata) { - _ERR("failed to allocate view data"); - return; - } - - vdata->list = mediadata_get_medialist(priv->md); - vdata->index = util_get_media_index(vdata->list, am); + vdata.list = mediadata_get_medialist(priv->md); + vdata.index = util_get_media_index(vdata.list, am); - viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, vdata); + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); } diff --git a/src/layout/movie.c b/src/layout/movie.c index f0d1478..d127e31 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -117,7 +117,7 @@ static struct grid_class _gclass = { static void _grid_selected_cb(void *data, Elm_Object_Item *it) { app_media *am; - struct view_data *vdata; + struct view_update_data vdata; struct _priv *priv; if (!data || !it) { @@ -133,16 +133,10 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it) return; } - vdata = calloc(1, sizeof(*vdata)); - if (!vdata) { - _ERR("failed to allocate view data"); - return; - } - - vdata->list = mediadata_get_medialist(priv->md); - vdata->index = util_get_media_index(vdata->list, am); + vdata.list = mediadata_get_medialist(priv->md); + vdata.index = util_get_media_index(vdata.list, am); - viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, vdata); + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); } diff --git a/src/view/viewer.c b/src/view/viewer.c index 79f2e51..4a80d83 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -24,6 +24,7 @@ #include #include "define.h" +#include "view.h" #include "util/controller.h" #include "util/timeout_handler.h" #include "util/playermgr.h" @@ -173,62 +174,6 @@ static struct _viewer_info viewer_info[] = { }, }; -/* FIXME: test function */ -static bool _media(media_info_h media_h, void *dt) -{ - struct _priv *priv; - app_media *am; - - priv = dt; - - am = app_media_create(media_h); - - priv->playlist.list = eina_list_append(priv->playlist.list, am); - - return true; -} - -static void _media_test(struct _priv *priv, int mode) -{ - char *path = "/home/owner/content/Videos/Xmen-Days_of_Future_Past.mp4"; - filter_h filter; - char buf[1024]; - int r; - - r = media_filter_create(&filter); - if (r != MEDIA_CONTENT_ERROR_NONE) { - _ERR("Media Filter Creation Failed"); - return; - } - - if (mode) - snprintf(buf, sizeof(buf), "MEDIA_PATH = \"%s\"", path); - else - snprintf(buf, sizeof(buf), "MEDIA_TYPE=0 OR MEDIA_TYPE=1"); - - r = media_filter_set_condition(filter, buf, - MEDIA_CONTENT_COLLATE_DEFAULT); - if (r != MEDIA_CONTENT_ERROR_NONE) { - _ERR("Fail to set filter condition"); - media_filter_destroy(filter); - return; - } - - media_content_connect(); - - r = media_info_foreach_media_from_db(filter, _media, priv); - if (r != MEDIA_CONTENT_ERROR_NONE) { - _ERR("MEDIA CONTENT ERROR: %d", r); - media_filter_destroy(filter); - media_content_disconnect(); - return; - } - - media_filter_destroy(filter); - media_content_disconnect(); -} -/* FIXME: test function end */ - /* * NOTE: Workaround * we assumed that if video content have the copyright then it's a movie. @@ -385,7 +330,7 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) elm_object_part_text_set(priv->base, PART_VIEWER_TITLE, mi->title); } else { - strftime(date, sizeof(date), "%d %b", mi->content_time); + strftime(date, sizeof(date), "%d %b, %Y", mi->content_time); strftime(day, sizeof(day), "%a", mi->content_time); util_up_string(day); @@ -883,9 +828,6 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } - /* FIXME: test code */ - _media_test(priv, 0); - viewmgr_set_view_data(VIEW_VIEWER, priv); return base; @@ -902,7 +844,6 @@ static void _show(void *view_data) priv = view_data; - /* FIXME: test code */ _viewer_show(priv, DIR_NONE); timeout_handler_reset(priv->timeout); @@ -926,10 +867,31 @@ static void _hide(void *view_data) evas_object_hide(priv->base); } +static void _update(void *view_data, int update_type, void *data) +{ + struct _priv *priv; + struct view_update_data *vdata; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + if (!data) { + _ERR("invalid parameter"); + return; + } + + priv = view_data; + vdata = data; + + priv->playlist.list = vdata->list; + priv->playlist.cur = vdata->index; +} + static void _destroy(void *view_data) { struct _priv *priv; - app_media *am; if (!view_data) { _ERR("failed to get view data"); @@ -940,9 +902,6 @@ static void _destroy(void *view_data) _viewer_delete(priv); - EINA_LIST_FREE(priv->playlist.list, am) - app_media_destroy(am); - timeout_handler_fini(priv->timeout); playermgr_destroy(priv->player); @@ -957,6 +916,7 @@ static view_class _vclass = { .create = _create, .show = _show, .hide = _hide, + .update = _update, .destroy = _destroy, }; -- 2.7.4 From bdf90efceec6ba4f371897c4f5a044560841a995 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 9 Jul 2015 09:24:22 +0900 Subject: [PATCH 14/16] viewer: process back key event Change-Id: I633b86d66247b334d57170dfbf51c31f652310b0 Signed-off-by: Minkyu Kang --- src/util/timeout_handler.c | 1 - src/view/viewer.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/util/timeout_handler.c b/src/util/timeout_handler.c index e35f571..4d73de1 100644 --- a/src/util/timeout_handler.c +++ b/src/util/timeout_handler.c @@ -87,7 +87,6 @@ struct timeout_handler *timeout_handler_init(double timeout, int i; int event_type[] = { ECORE_EVENT_KEY_UP, - ECORE_EVENT_KEY_DOWN, ECORE_EVENT_MOUSE_BUTTON_DOWN, ECORE_EVENT_MOUSE_BUTTON_UP, ECORE_EVENT_MOUSE_MOVE, diff --git a/src/view/viewer.c b/src/view/viewer.c index 4a80d83..8adbea9 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -329,6 +330,9 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) if (id == VIEWER_MOVIE) { elm_object_part_text_set(priv->base, PART_VIEWER_TITLE, mi->title); + + elm_object_part_text_set(priv->base, PART_VIEWER_DATE, ""); + elm_object_part_text_set(priv->base, PART_VIEWER_PAGE, ""); } else { strftime(date, sizeof(date), "%d %b, %Y", mi->content_time); strftime(day, sizeof(day), "%a", mi->content_time); @@ -341,6 +345,8 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi) snprintf(buf, sizeof(buf), "%d / %d", priv->playlist.cur + 1, eina_list_count(priv->playlist.list)); elm_object_part_text_set(priv->base, PART_VIEWER_PAGE, buf); + + elm_object_part_text_set(priv->base, PART_VIEWER_TITLE, ""); } } @@ -562,6 +568,16 @@ static void _hide_bar(struct _priv *priv) ctl->ops->disable(ctl->handle); } +static void _pop_view(struct _priv *priv) +{ + struct view_update_data vdata; + + vdata.index = priv->playlist.cur; + + viewmgr_update_view(VIEW_BASE, UPDATE_FOCUS, &vdata); + viewmgr_pop_view(); +} + static void _timeout_cb(void *data, int type, void *ei) { _hide_bar(data); @@ -569,6 +585,30 @@ static void _timeout_cb(void *data, int type, void *ei) static void _event_cb(void *data, int type, void *ei) { + struct _priv *priv; + + if (!data) + return; + + priv = data; + + if (type == ECORE_EVENT_KEY_UP) { + Evas_Event_Key_Up *ev; + + if (!ei) + return; + + ev = ei; + + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + if (priv->bar_show) { + _pop_view(priv); + return; + } + } + } + _show_bar(data); } -- 2.7.4 From 678f78f436ecfa98835e90f236504744ee9f4d51 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 9 Jul 2015 15:43:33 +0900 Subject: [PATCH 15/16] listmgr: set current state of selected item to false Change-Id: I5713ccb9057770c14451e26436ea9e27acee7cad Signed-off-by: Jehun Lim --- src/util/listmgr.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/util/listmgr.c b/src/util/listmgr.c index a340e1f..b671a49 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -66,6 +66,8 @@ void _grid_selected_cb(void *data, Elm_Object_Item *it, if (ldata->grid_selected_cb) ldata->grid_selected_cb(ldata->cb_data, it); + + elm_gengrid_item_selected_set(it, EINA_FALSE); } void _grid_realized_cb(int id, void *data, Evas_Object *obj, -- 2.7.4 From 4c8cb9d73a17594fcb8da1912f728202c5e969a4 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 9 Jul 2015 17:38:58 +0900 Subject: [PATCH 16/16] timeout_handler: add function for enable/disable handler Change-Id: I45dc8113dd9e5b8d8f336476c1753966849910a0 Signed-off-by: Minkyu Kang --- include/util/timeout_handler.h | 2 ++ src/util/timeout_handler.c | 18 ++++++++++++++++++ src/view/viewer.c | 3 +++ 3 files changed, 23 insertions(+) diff --git a/include/util/timeout_handler.h b/include/util/timeout_handler.h index 29dd6e1..5cd0aab 100644 --- a/include/util/timeout_handler.h +++ b/include/util/timeout_handler.h @@ -29,4 +29,6 @@ void timeout_handler_fini(struct timeout_handler *handle); void timeout_handler_reset(struct timeout_handler *handle); +void timeout_handler_enable(struct timeout_handler *handle, bool enable); + #endif diff --git a/src/util/timeout_handler.c b/src/util/timeout_handler.c index 4d73de1..dce195f 100644 --- a/src/util/timeout_handler.c +++ b/src/util/timeout_handler.c @@ -31,6 +31,7 @@ struct timeout_handler { void *timeout_data; double timeout; + bool enable; }; static Eina_Bool _timer_cb(void *data) @@ -42,6 +43,9 @@ static Eina_Bool _timer_cb(void *data) handle = data; + if (!handle->enable) + return ECORE_CALLBACK_CANCEL; + handle->timeout_cb(handle->timeout_data, 0, NULL); handle->timer = NULL; @@ -57,6 +61,9 @@ static Eina_Bool _event_occured(void *data, int type, void *event) handle = data; + if (!handle->enable) + return ECORE_CALLBACK_PASS_ON; + handle->event_cb(handle->event_data, type, event); timeout_handler_reset(handle); @@ -64,6 +71,16 @@ static Eina_Bool _event_occured(void *data, int type, void *event) return ECORE_CALLBACK_PASS_ON; } +void timeout_handler_enable(struct timeout_handler *handle, bool enable) +{ + handle->enable = enable; + + if (!enable) { + ecore_timer_del(handle->timer); + handle->timer = NULL; + } +} + void timeout_handler_reset(struct timeout_handler *handle) { if (!handle) { @@ -117,6 +134,7 @@ struct timeout_handler *timeout_handler_init(double timeout, handle->timeout_cb = timeout_cb; handle->timeout_data = timeout_data; handle->timeout = timeout; + handle->enable = false; return handle; diff --git a/src/view/viewer.c b/src/view/viewer.c index 8adbea9..e3a9a8a 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -886,6 +886,7 @@ static void _show(void *view_data) _viewer_show(priv, DIR_NONE); + timeout_handler_enable(priv->timeout, true); timeout_handler_reset(priv->timeout); evas_object_show(priv->base); @@ -904,6 +905,8 @@ static void _hide(void *view_data) _viewer_hide(priv); + timeout_handler_enable(priv->timeout, false); + evas_object_hide(priv->base); } -- 2.7.4