summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMinkyu Kang <mk7.kang@samsung.com>2015-10-01 13:41:53 +0900
committerMinkyu Kang <mk7.kang@samsung.com>2015-10-01 13:41:53 +0900
commite425d0585f2e56bdc9fa78c50227fd9c945bd970 (patch)
tree6590535d74e3dbf3f28ec7a2dfd6e4d1dcdcc2d8 /src
parent42643ae109ad310f9b356d996be1247aaefaa85d (diff)
downloadair_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.c47
-rw-r--r--src/view/action_menu.c208
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++)