summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/define.h1
-rw-r--r--res/edc/widgets/button.edc128
-rw-r--r--src/view/action_menu.c190
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;