diff options
author | Minkyu Kang <mk7.kang@samsung.com> | 2015-10-01 13:41:53 +0900 |
---|---|---|
committer | Minkyu Kang <mk7.kang@samsung.com> | 2015-10-01 13:41:53 +0900 |
commit | e425d0585f2e56bdc9fa78c50227fd9c945bd970 (patch) | |
tree | 6590535d74e3dbf3f28ec7a2dfd6e4d1dcdcc2d8 /src | |
parent | 42643ae109ad310f9b356d996be1247aaefaa85d (diff) | |
download | air_mediahub-e425d0585f2e56bdc9fa78c50227fd9c945bd970.tar.gz air_mediahub-e425d0585f2e56bdc9fa78c50227fd9c945bd970.tar.bz2 air_mediahub-e425d0585f2e56bdc9fa78c50227fd9c945bd970.zip |
action_menu: scrolls the whole area of action menu
Change-Id: I4cbd1d0f47c7d9c8d7f80813e3406c1a5dd65e33
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/util/util.c | 47 | ||||
-rw-r--r-- | src/view/action_menu.c | 208 |
2 files changed, 190 insertions, 65 deletions
diff --git a/src/util/util.c b/src/util/util.c index 3e9c86d..c698a3d 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -16,6 +16,7 @@ #include <stdbool.h> #include <Elementary.h> +#include <app_control.h> #include <app_debug.h> #include <app_contents.h> @@ -33,6 +34,52 @@ bool util_check_movie_type(const char *str) return strcmp(str, VIDEO_COPYRIGHT); } +bool util_launch_request(const char *appid, const char *key, const char *value) +{ + app_control_h app_ctrl; + int r; + + r = app_control_create(&app_ctrl); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to create app control handle"); + return false; + } + + r = app_control_set_operation(app_ctrl, APP_CONTROL_OPERATION_DEFAULT); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to set app control operation"); + app_control_destroy(app_ctrl); + return false; + } + + if (key && value) { + r = app_control_add_extra_data(app_ctrl, key, value); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to add extra data"); + app_control_destroy(app_ctrl); + return false; + } + } + + r = app_control_set_app_id(app_ctrl, appid); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to set app control app id"); + app_control_destroy(app_ctrl); + return false; + } + + r = app_control_send_launch_request(app_ctrl, NULL, NULL); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to send app control launch request"); + app_control_destroy(app_ctrl); + return false; + } + + app_control_destroy(app_ctrl); + + return true; +} + Evas_Object *util_add_button(Evas_Object *base, const char *style, const char *text) { diff --git a/src/view/action_menu.c b/src/view/action_menu.c index c4f21cd..0eb90b6 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -15,7 +15,6 @@ */ #include <Elementary.h> -#include <app_control.h> #include <app_debug.h> #include <app_contents.h> #include <app_define.h> @@ -28,6 +27,7 @@ #define TEXT_LIVETV "Live TV" #define TEXT_FAVORITE "Favorite" +#define TEXT_MORE "More" #define NUM_MENU_BTN 4 #define MAX_BTN_COL 4 @@ -35,9 +35,12 @@ #define TABLE_PADDING_X 0 #define TABLE_PADDING_Y 0 +#define GRID_PADDING 20 + enum _object_type { ACTION_DISABLED = -1, ACTION_LIVETV_BTN = 0, + ACTION_MORE_BTN, ACTION_FAVORITE_BTN, ACTION_DELETE_BTN, ACTION_FAVORITE_GRID @@ -53,12 +56,16 @@ enum _content_type { struct _priv { Evas_Object *win; Evas_Object *base; + Evas_Object *scr; + Evas_Object *box; + Evas_Object *content; + Evas_Object *nocontent; Evas_Object *tv_btn; + Evas_Object *more_btn; Evas_Object *menu_btn[NUM_MENU_BTN]; Evas_Object *table; - Evas_Object *ly; Evas_Object *grid; Elm_Object_Item *selected_it; @@ -78,10 +85,12 @@ struct _menu_info { struct _content_info { int grid_x; int grid_y; + int grid_n; const char *style; int app_contents_type; + const char *category; const char *no_content; }; @@ -116,22 +125,28 @@ struct _content_info content_info[] = { { .grid_x = GRID_ITEM_X_MOVIE, .grid_y = GRID_ITEM_Y_MOVIE, + .grid_n = GRID_ITEM_N_MOVIE, .style = STYLE_GRID_MOVIE_ITEM_FAVORITE, .app_contents_type = CONTENTS_MOVIE, + .category = CATEGORY_MOVIE, .no_content = "No favorite Movies" }, { .grid_x = GRID_ITEM_X_GALLERY, .grid_y = GRID_ITEM_Y_GALLERY, + .grid_n = GRID_ITEM_N_GALLERY, .style = STYLE_GRID_GALLERY_ITEM_FAVORITE, .app_contents_type = CONTENTS_GALLERY, + .category = CATEGORY_GALLERY, .no_content = "No favorite Contents" }, { .grid_x = GRID_ITEM_X_MUSIC, .grid_y = GRID_ITEM_Y_MUSIC, + .grid_n = GRID_ITEM_N_MUSIC, .style = STYLE_GRID_SONG_ITEM_FAVORITE, .app_contents_type = CONTENTS_MUSIC, + .category = CATEGORY_MUSIC, .no_content = "No favorite Songs" } }; @@ -154,38 +169,24 @@ static void _hide_view(struct _priv *priv, bool anim) static bool _livetv_clicked(struct _priv *priv) { - app_control_h app_ctrl; - int r; - - r = app_control_create(&app_ctrl); - if (r != APP_CONTROL_ERROR_NONE) { - _ERR("failed to create app control handle"); + if (!util_launch_request(APP_ID_LIVETV, NULL, NULL)) { + _ERR("launch failed: %s\n", APP_ID_LIVETV); return false; } - r = app_control_set_operation(app_ctrl, APP_CONTROL_OPERATION_DEFAULT); - if (r != APP_CONTROL_ERROR_NONE) { - _ERR("failed to set app control operation"); - app_control_destroy(app_ctrl); - return false; - } + _hide_view(priv, false); - r = app_control_set_app_id(app_ctrl, APP_ID_LIVETV); - if (r != APP_CONTROL_ERROR_NONE) { - _ERR("failed to set app control app id"); - app_control_destroy(app_ctrl); - return false; - } + return true; +} - r = app_control_send_launch_request(app_ctrl, NULL, NULL); - if (r != APP_CONTROL_ERROR_NONE) { - _ERR("failed to send app control launch request"); - app_control_destroy(app_ctrl); +static bool _more_clicked(struct _priv *priv) +{ + if (!util_launch_request(APP_ID_FAVORITE, PARAM_CATEGORY, + content_info[priv->content_type].category)) { + _ERR("launch failed: %s\n", APP_ID_FAVORITE); return false; } - app_control_destroy(app_ctrl); - _hide_view(priv, false); return true; @@ -280,6 +281,7 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, switch (id) { case ACTION_LIVETV_BTN: + case ACTION_MORE_BTN: case ACTION_FAVORITE_BTN: case ACTION_DELETE_BTN: if (!elm_object_focus_get(obj)) @@ -313,6 +315,9 @@ static void _clicked_cb(int id, void *data, Evas_Object *obj) case ACTION_LIVETV_BTN: _livetv_clicked(priv); break; + case ACTION_MORE_BTN: + _more_clicked(priv); + break; case ACTION_FAVORITE_BTN: _favorite_clicked(priv, obj); break; @@ -594,18 +599,13 @@ static bool _draw_livetv_btn(struct _priv *priv) { Evas_Object *btn; - btn = elm_button_add(priv->base); - if (!btn) { - _ERR("failed to create button object"); + btn = util_add_button(priv->content, STYLE_BTN_LIVETV, TEXT_LIVETV); + if (!btn) return false; - } - - elm_object_style_set(btn, STYLE_BTN_LIVETV); - elm_object_text_set(btn, TEXT_LIVETV); inputmgr_add_callback(btn, ACTION_LIVETV_BTN, &_handler, priv); - elm_object_part_content_set(priv->base, PART_ACTION_TV_BTN, btn); + elm_object_part_content_set(priv->content, PART_ACTION_TV_BTN, btn); evas_object_show(btn); @@ -617,17 +617,38 @@ static bool _draw_livetv_btn(struct _priv *priv) return true; } +static bool _draw_more_btn(struct _priv *priv) +{ + Evas_Object *btn; + + btn = util_add_button(priv->box, STYLE_BTN_MORE, TEXT_MORE); + if (!btn) + return false; + + inputmgr_add_callback(btn, ACTION_MORE_BTN, &_handler, priv); + + evas_object_show(btn); + elm_box_pack_end(priv->box, btn); + + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT); + + priv->more_btn = btn; + + return true; +} + static bool _draw_menu_area(struct _priv *priv) { Evas_Object *table; - table = util_add_table(priv->base, TABLE_PADDING_X, TABLE_PADDING_Y); + table = util_add_table(priv->content, TABLE_PADDING_X, TABLE_PADDING_Y); if (!table) { _ERR("failed to add table"); return false; } - elm_object_part_content_set(priv->base, PART_ACTION_MENU_AREA, table); + elm_object_part_content_set(priv->content, PART_ACTION_MENU_AREA, table); priv->table = table; @@ -638,10 +659,10 @@ static bool _draw_favorite_area(struct _priv *priv) { Evas_Object *ly, *grid; - elm_object_part_text_set(priv->base, PART_ACTION_FAVORITE_TITLE, + elm_object_part_text_set(priv->content, PART_ACTION_FAVORITE_TITLE, TEXT_FAVORITE); - ly = elm_layout_add(priv->base); + ly = elm_layout_add(priv->content); if (!ly) { _ERR("failed to create layout object"); return false; @@ -649,9 +670,7 @@ static bool _draw_favorite_area(struct _priv *priv) elm_layout_file_set(ly, EDJEFILE, GRP_ACTION_NO_CONTENT); - elm_object_part_content_set(priv->base, PART_ACTION_NO_CONTENT_BG, ly); - - grid = util_add_gengrid(priv->base, 0, 0, EINA_FALSE); + grid = util_add_gengrid(priv->content, 0, 0, EINA_FALSE); if (!grid) { _ERR("failed to create gengrid object"); evas_object_del(ly); @@ -660,13 +679,12 @@ static bool _draw_favorite_area(struct _priv *priv) inputmgr_add_callback(grid, ACTION_FAVORITE_GRID, &_handler, priv); + elm_object_focus_region_show_mode_set(grid, ELM_FOCUS_REGION_SHOW_ITEM); + elm_object_focus_next_object_set(grid, grid, ELM_FOCUS_LEFT); elm_object_focus_next_object_set(grid, grid, ELM_FOCUS_RIGHT); - elm_object_part_content_set(priv->base, - PART_ACTION_FAVORITE_AREA, grid); - - priv->ly = ly; + priv->nocontent = ly; priv->grid = grid; return true; @@ -708,15 +726,13 @@ static void _update_menu_area(struct _priv *priv) } for (i = 0; i < NUM_MENU_BTN; i++) { - btn = elm_button_add(priv->base); + btn = util_add_button(priv->content, menu_info[i].style, + menu_info[i].title); if (!btn) { _ERR("failed to create button object"); return; } - elm_object_style_set(btn, menu_info[i].style); - elm_object_text_set(btn, menu_info[i].title); - _set_menu_state(btn, i, mi->media_id); evas_object_show(btn); @@ -745,20 +761,18 @@ static void _update_menu_area(struct _priv *priv) static void _update_no_content_area(struct _priv *priv) { - if (!priv->favorite_list) { - elm_object_signal_emit(priv->ly, SIG_SHOW_NO_CONTENT, - SIG_SOURCE_SRC); - elm_object_part_text_set(priv->ly, PART_NO_CONTENT_TEXT, - content_info[priv->content_type]. - no_content); - - elm_object_focus_allow_set(priv->grid, EINA_FALSE); - } else { - elm_object_signal_emit(priv->ly, SIG_HIDE_NO_CONTENT, - SIG_SOURCE_SRC); + int i; - elm_object_focus_allow_set(priv->grid, EINA_TRUE); + for (i = 0; i < NUM_MENU_BTN; i++) { + elm_object_focus_next_object_set(priv->menu_btn[i], + priv->more_btn, ELM_FOCUS_DOWN); } + + elm_object_part_text_set(priv->nocontent, PART_NO_CONTENT_TEXT, + content_info[priv->content_type].no_content); + + elm_object_part_content_set(priv->content, PART_ACTION_NO_CONTENT_BG, + priv->nocontent); } static void _update_favorite_area(struct _priv *priv) @@ -769,8 +783,11 @@ static void _update_favorite_area(struct _priv *priv) Eina_List *l; app_media *am; int type; + int count; elm_gengrid_clear(priv->grid); + elm_object_part_content_unset(priv->content, PART_ACTION_NO_CONTENT_BG); + elm_object_part_content_unset(priv->content, PART_ACTION_FAVORITE_AREA); type = priv->content_type; @@ -780,6 +797,11 @@ static void _update_favorite_area(struct _priv *priv) priv->favorite_list = _get_favorite_list( content_info[type].app_contents_type); + if (!priv->favorite_list) { + _update_no_content_area(priv); + return; + } + elm_gengrid_item_size_set(priv->grid, elm_config_scale_get() * content_info[type].grid_x, elm_config_scale_get() * content_info[type].grid_y); @@ -788,17 +810,43 @@ static void _update_favorite_area(struct _priv *priv) EINA_LIST_FOREACH(priv->favorite_list, l, am) { it = elm_gengrid_item_append(priv->grid, ic, am, NULL, NULL); - elm_object_item_data_set(it, am); } elm_gengrid_item_class_free(ic); - _update_no_content_area(priv); + count = eina_list_count(priv->favorite_list) / content_info[type].grid_n; + if (eina_list_count(priv->favorite_list) % content_info[type].grid_n) + count++; + + evas_object_size_hint_min_set(priv->grid, 0, elm_config_scale_get() * + content_info[type].grid_y * count); + elm_scroller_step_size_set(priv->scr, 0, + content_info[type].grid_y + GRID_PADDING); + + elm_object_part_content_set(priv->content, + PART_ACTION_FAVORITE_AREA, priv->grid); } static bool _draw_items(struct _priv *priv) { + Evas_Object *base; + + base = elm_layout_add(priv->box); + if (!base) { + _ERR("failed to create base object"); + return false; + } + + elm_layout_file_set(base, EDJEFILE, GRP_ACTION_MENU_CONTENT); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + evas_object_show(base); + elm_box_pack_end(priv->box, base); + + priv->content = base; + if (!_draw_livetv_btn(priv)) { _ERR("failed to draw livetv button"); return false; @@ -814,6 +862,11 @@ static bool _draw_items(struct _priv *priv) return false; } + if (!_draw_more_btn(priv)) { + _ERR("failed to draw livetv button"); + return false; + } + return true; } @@ -844,7 +897,7 @@ static bool _update_items(struct _priv *priv, struct view_update_data *vdata) static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; - Evas_Object *base; + Evas_Object *base, *scr, *box; if (!win) { _ERR("failed to get win object"); @@ -865,13 +918,35 @@ static Evas_Object *_create(Evas_Object *win, void *data) } elm_layout_file_set(base, EDJEFILE, GRP_ACTION_MENU_VIEW); - evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, base); + scr = util_add_scroller(base); + if (!scr) { + _ERR("failed to add scroller"); + evas_object_del(base); + free(priv); + return NULL; + } + + box = util_add_box(scr, EINA_FALSE); + if (!box) { + _ERR("failed to add box"); + evas_object_del(base); + free(priv); + return NULL; + } + + evas_object_show(box); + elm_object_content_set(scr, box); + + elm_object_part_content_set(base, PART_ACTION_MENU, scr); + priv->win = win; priv->base = base; + priv->scr = scr; + priv->box = box; viewmgr_set_view_data(VIEW_ACTION_MENU, priv); @@ -898,6 +973,8 @@ static void _show(void *view_data) priv = view_data; + elm_scroller_region_show(priv->scr, 0, 0, 0, 0); + evas_object_show(priv->base); viewmgr_update_view(VIEW_BASE, UPDATE_TOAST_HIDE, NULL); @@ -973,6 +1050,7 @@ static void _destroy(void *view_data) priv = view_data; inputmgr_remove_callback(priv->tv_btn, &_handler); + inputmgr_remove_callback(priv->more_btn, &_handler); inputmgr_remove_callback(priv->grid, &_handler); for (i = 0; i < NUM_MENU_BTN; i++) |