diff options
-rw-r--r-- | include/define.h | 1 | ||||
-rw-r--r-- | res/edc/widgets/button.edc | 128 | ||||
-rw-r--r-- | src/view/action_menu.c | 190 |
3 files changed, 266 insertions, 53 deletions
diff --git a/include/define.h b/include/define.h index c626565..0d68bd9 100644 --- a/include/define.h +++ b/include/define.h @@ -74,6 +74,7 @@ #define SIG_ITEM_FOCUSED "item,focused" #define SIG_ITEM_SELECTED "item,selected" #define SIG_ITEM_UNSELECTED "item,unselected" +#define SIG_ITEM_TOGGLED "item,toggled" #define SIG_ELM_DISABLED "elm,state,disabled" #define SIG_ELM_FOCUS "elm,action,focus" #define SIG_ELM_UNFOCUS "elm,action,unfocus" diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 3973cc9..a854c6b 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -18,6 +18,7 @@ #define STATE_FOCUSED 1 #define STATE_SELECTED 2 #define STATE_DISABLED 3 +#define STATE_TOGGLED 4 #define STATE_SHOW 0 #define STATE_HIDE 1 @@ -3417,6 +3418,14 @@ group { color: COLOR_ITEM_FOCUS; } description { + state: "default_toggle" 0.0; + inherit: "default" 0.0; + } + description { + state: "focused_toggle" 0.0; + inherit: "focused" 0.0; + } + description { state: "selected" 0.0; inherit: "default" 0.0; } @@ -3515,6 +3524,16 @@ group { image.normal: IMAGE_ACTION_FAVORITE_FOC; } description { + state: "default_toggle" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_ACTION_FAVORITE_NOR; + } + description { + state: "focused_toggle" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_ACTION_FAVORITE_FOC; + } + description { state: "selected" 0.0; inherit: "default" 0.0; image.normal: IMAGE_ACTION_FAVORITE_SEL; @@ -3568,6 +3587,14 @@ group { color: COLOR_TEXT_FOCUS; } description { + state: "default_toggle" 0.0; + inherit: "default" 0.0; + } + description { + state: "focused_toggle" 0.0; + inherit: "focused" 0.0; + } + description { state: "selected" 0.0; inherit: "default" 0.0; color: COLOR_ITEM_SELECTED; @@ -3578,6 +3605,15 @@ group { color: COLOR_TEXT_DISABLED; } } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } } programs { program { @@ -3589,9 +3625,57 @@ group { } } program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "anim,clicked,default"; + action: STATE_SET "focused_toggle" 0.0; + target: "bg"; + target: "menu_icon"; + target: "elm.text"; + transition: TRANSITION_CLICK; + } + program { + name: "anim,clicked,toggle"; + action: STATE_SET "focused" 0.0; + target: "bg"; + target: "menu_icon"; + target: "elm.text"; + transition: TRANSITION_CLICK; + } + program { name: "go_active"; signal: SIG_ELM_FOCUS; source: SIG_SOURCE_ELM; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_NORMAL) + run_program(PROGRAM:"focus,default"); + else + run_program(PROGRAM:"focus,toggle"); + } + } + program { + name: "go_passive"; + signal: SIG_ELM_UNFOCUS; + source: SIG_SOURCE_ELM; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_NORMAL) + run_program(PROGRAM:"unfocus,default"); + else + run_program(PROGRAM:"unfocus,toggle"); + } + } + program { + name: "focus,default"; action: STATE_SET "focused" 0.0; target: "bg"; target: "menu_icon"; @@ -3599,9 +3683,15 @@ group { transition: TRANSITION_FOCUS; } program { - name: "go_passive"; - signal: SIG_ELM_UNFOCUS; - source: SIG_SOURCE_ELM; + name: "focus,toggle"; + action: STATE_SET "focused_toggle" 0.0; + target: "bg"; + target: "menu_icon"; + target: "elm.text"; + transition: TRANSITION_FOCUS; + } + program { + name: "unfocus,default"; action: STATE_SET "default" 0.0; target: "bg"; target: "menu_icon"; @@ -3609,6 +3699,28 @@ group { transition: TRANSITION_FOCUS; } program { + name: "unfocus,toggle"; + action: STATE_SET "default_toggle" 0.0; + target: "bg"; + target: "menu_icon"; + target: "elm.text"; + transition: TRANSITION_FOCUS; + } + program { + name: SIG_ITEM_TOGGLED; + signal: SIG_ITEM_TOGGLED; + source: SIG_SOURCE_SRC; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_NORMAL) { + set_int(cur_state, STATE_TOGGLED); + set_state(PART:"menu_icon","default_toggle",0.0); + } + } + } + program { name: SIG_ITEM_SELECTED; signal: SIG_ITEM_SELECTED; source: SIG_SOURCE_SRC; @@ -3651,6 +3763,16 @@ group { image.normal: IMAGE_ACTION_DELETE_FOC; } description { + state: "default_toggle" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_ACTION_DELETE_NOR; + } + description { + state: "focused_toggle" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_ACTION_DELETE_FOC; + } + description { state: "selected" 0.0; inherit: "default" 0.0; image.normal: IMAGE_ACTION_DELETE_SEL; diff --git a/src/view/action_menu.c b/src/view/action_menu.c index b2241fd..34b682d 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -36,8 +36,10 @@ #define TABLE_PADDING_Y 0 enum _object_type { + ACTION_DISABLED = -1, ACTION_LIVETV_BTN = 0, - ACTION_MENU_BTN, + ACTION_FAVORITE_BTN, + ACTION_DELETE_BTN, ACTION_FAVORITE_GRID }; @@ -54,16 +56,19 @@ struct _priv { Evas_Object *tv_btn; Evas_Object *menu_btn[NUM_MENU_BTN]; + Evas_Object *table; Evas_Object *grid; Elm_Object_Item *selected_it; Eina_List *favorite_list; + app_media_info *mi; int content_type; }; struct _menu_info { + int id; const char *title; const char *style; Eina_Bool disabled; @@ -79,21 +84,25 @@ struct _content_info { static struct _menu_info menu_info[] = { { + .id = ACTION_FAVORITE_BTN, .title = "Favorite", .style = STYLE_BTN_FAVORITE, .disabled = EINA_FALSE }, { + .id = ACTION_DELETE_BTN, .title = "Delete", .style = STYLE_BTN_DELETE, .disabled = EINA_TRUE }, { + .id = ACTION_DISABLED, .title = NULL, .style = STYLE_BTN_EMPTY, .disabled = EINA_TRUE }, { + .id = ACTION_DISABLED, .title = NULL, .style = STYLE_BTN_EMPTY, .disabled = EINA_TRUE @@ -121,6 +130,37 @@ struct _content_info content_info[] = { } }; +static bool _favorite_clicked(struct _priv *priv, Evas_Object *obj) +{ + int r; + bool favorite; + + r = app_contents_favorite_check(CONTENTS_MEDIA, + priv->mi->media_id, &favorite); + if (r != APP_CONTENTS_ERROR_NONE) { + _ERR("failed to check favorite"); + return false; + } + + r = app_contents_favorite_set(CONTENTS_MEDIA, + priv->mi->media_id, !favorite); + if (r != APP_CONTENTS_ERROR_NONE) { + _ERR("failed to set favorite"); + return false; + } + + viewmgr_hide_view(VIEW_ACTION_MENU); + + return true; +} + +static bool _delete_clicked(struct _priv *priv, Evas_Object *obj) +{ + /* It will be implemented later */ + + return true; +} + static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { @@ -142,7 +182,8 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, switch (id) { case ACTION_LIVETV_BTN: - case ACTION_MENU_BTN: + case ACTION_FAVORITE_BTN: + case ACTION_DELETE_BTN: if (!elm_object_focus_get(obj)) elm_object_focus_set(obj, EINA_TRUE); @@ -161,6 +202,27 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, } } +static void _clicked_cb(int id, void *data, Evas_Object *obj) +{ + struct _priv *priv; + + if (!obj || !data) + return; + + priv = data; + + switch (id) { + case ACTION_FAVORITE_BTN: + _favorite_clicked(priv, obj); + break; + case ACTION_DELETE_BTN: + _delete_clicked(priv, obj); + break; + default: + break; + } +} + static void _grid_selected(void *data) { app_media *am; @@ -224,6 +286,7 @@ static void _selected_cb(int id, void *data, Evas_Object *obj, static input_handler _handler = { .key_down = _key_down_cb, .mouse_move = _mouse_move_cb, + .clicked = _clicked_cb, .selected = _selected_cb }; @@ -460,9 +523,7 @@ static bool _draw_livetv_btn(struct _priv *priv) static bool _draw_menu_area(struct _priv *priv) { - Evas_Object *table, *btn; - int i; - int col, row; + Evas_Object *table; table = util_add_table(priv->base, TABLE_PADDING_X, TABLE_PADDING_Y); if (!table) { @@ -470,45 +531,10 @@ static bool _draw_menu_area(struct _priv *priv) return false; } - for (i = 0; i < NUM_MENU_BTN; i++) { - btn = elm_button_add(priv->base); - if (!btn) { - _ERR("failed to create button object"); - evas_object_del(table); - return false; - } - - elm_object_style_set(btn, menu_info[i].style); - elm_object_text_set(btn, menu_info[i].title); - - if (menu_info[i].disabled) - elm_object_disabled_set(btn, EINA_TRUE); - - evas_object_show(btn); - - inputmgr_add_callback(btn, ACTION_MENU_BTN, &_handler, priv); - - elm_object_focus_next_object_set(btn, priv->grid, - ELM_FOCUS_DOWN); - - col = i % MAX_BTN_COL; - row = i / MAX_BTN_COL; - - elm_table_pack(table, btn, col, row, 1, 1); - - priv->menu_btn[i] = btn; - } - - evas_object_show(table); - - elm_object_focus_next_object_set(priv->menu_btn[0], priv->menu_btn[0], - ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(priv->menu_btn[NUM_MENU_BTN - 1], - priv->menu_btn[NUM_MENU_BTN - 1], - ELM_FOCUS_RIGHT); - elm_object_part_content_set(priv->base, PART_ACTION_MENU_AREA, table); + priv->table = table; + return true; } @@ -538,6 +564,70 @@ static bool _draw_favorite_area(struct _priv *priv) return true; } +static void _set_menu_state(Evas_Object *btn, int idx, const char *id) +{ + int r; + bool favorite; + + if (menu_info[idx].disabled) { + elm_object_disabled_set(btn, EINA_TRUE); + return; + } + + r = app_contents_favorite_check(CONTENTS_MEDIA, id, &favorite); + if (r != APP_CONTENTS_ERROR_NONE) { + _ERR("failed to check favorite"); + return; + } + + if (favorite) + elm_object_signal_emit(btn, SIG_ITEM_TOGGLED, SIG_SOURCE_SRC); +} + +static void _update_menu_area(struct _priv *priv) +{ + Evas_Object *btn; + int i; + int col, row; + + elm_table_clear(priv->table, EINA_TRUE); + + for (i = 0; i < NUM_MENU_BTN; i++) { + btn = elm_button_add(priv->base); + if (!btn) { + _ERR("failed to create button object"); + return; + } + + elm_object_style_set(btn, menu_info[i].style); + elm_object_text_set(btn, menu_info[i].title); + + _set_menu_state(btn, i, priv->mi->media_id); + + evas_object_show(btn); + + inputmgr_add_callback(btn, menu_info[i].id, &_handler, priv); + + elm_object_focus_next_object_set(btn, priv->grid, + ELM_FOCUS_DOWN); + + col = i % MAX_BTN_COL; + row = i / MAX_BTN_COL; + + elm_table_pack(priv->table, btn, col, row, 1, 1); + + priv->menu_btn[i] = btn; + } + + evas_object_show(priv->table); + + elm_object_focus_next_object_set(priv->menu_btn[0], priv->menu_btn[0], + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->menu_btn[NUM_MENU_BTN - 1], + priv->menu_btn[NUM_MENU_BTN - 1], + ELM_FOCUS_RIGHT); +} + static void _update_favorite_area(struct _priv *priv) { @@ -577,13 +667,13 @@ static bool _draw_items(struct _priv *priv) return false; } - if (!_draw_favorite_area(priv)) { - _ERR("failed to draw favorite area"); + if (!_draw_menu_area(priv)) { + _ERR("failed to draw menu button"); return false; } - if (!_draw_menu_area(priv)) { - _ERR("failed to draw menu button"); + if (!_draw_favorite_area(priv)) { + _ERR("failed to draw favorite area"); return false; } @@ -593,7 +683,6 @@ static bool _draw_items(struct _priv *priv) static bool _update_items(struct _priv *priv, struct view_update_data *vdata) { app_media *am; - app_media_info *mi; am = eina_list_nth(vdata->list, vdata->index); if (!am) { @@ -601,14 +690,15 @@ static bool _update_items(struct _priv *priv, struct view_update_data *vdata) return false; } - mi = app_media_get_info(am); - if (!mi) { + priv->mi = app_media_get_info(am); + if (!priv->mi) { _ERR("failed to get app media info"); return false; } - priv->content_type = _get_content_type(mi); + priv->content_type = _get_content_type(priv->mi); + _update_menu_area(priv); _update_favorite_area(priv); return true; |