}
}
part {
- name, "menu_area";
+ name, "menu_bg";
type, RECT;
scale, 1;
description {
state, "default" 0.0;
color, 255 255 255 255;
+ rel1.to, PART_CONTENT;
+ rel2.to, PART_CONTENT;
+ }
+ }
+
+ part {
+ name, PART_CONTENT;
+ type, SWALLOW;
+ scale, 1;
+ description {
+ state, "default" 0.0;
rel1.relative, 1.0 0.0;
min, 500 0;
align, 0.0 0.0;
- fixed, 1 1;
+ fixed, 1 0;
}
description {
state, "show" 0.0;
description {
state, "default" 0.0;
color, 0 0 0 25;
- rel1.to, "menu_area";
+ rel1.to, PART_CONTENT;
rel2 {
- to, "menu_area";
+ to, PART_CONTENT;
relative, 0.0 1.0;
}
min, 1 0;
}
part {
- name, "padding.livetv.btn";
+ name, "padding.channelinfo";
type, SPACER;
scale, 1;
description {
state, "default" 0.0;
- rel1.to, "menu_area";
+ rel1.relative, 0.0 0.0;
+ rel2.relative, 0.0 0.0;
+ min, 40 40;
+ align, 0.0 0.0;
+ fixed, 1 1;
+ }
+ }
+
+ part {
+ name, PART_CHANNELINFO;
+ type, SWALLOW;
+ scale, 1;
+ description {
+ state, "default" 0.0;
+ rel1 {
+ to, "padding.channelinfo";
+ relative, 1.0 1.0;
+ }
rel2 {
- to, "menu_area";
- relative, 1.0 0.0;
+ to, "padding.channelinfo";
+ relative, 1.0 1.0;
}
- min, 0 118;
+ min, 536 174;
+ align, 0.0 0.0;
+ fixed, 1 1;
+ }
+ }
+
+ }
+ programs {
+ program {
+ signal, SIGNAL_SHOW;
+ action, STATE_SET "show" 0.0;
+ target, PART_CONTENT;
+ transition, CUBIC_BEZIER 0.667 TRANSITION_EASE_IN_OUT;
+ }
+ program {
+ signal, SIGNAL_HIDE;
+ source, SOURCE_ELM;
+ action, STATE_SET "default" 0.0;
+ target, PART_CONTENT;
+ transition, CUBIC_BEZIER 0.334 TRANSITION_EASE_OUT;
+ after, "hide_finished";
+ }
+ program {
+ name, "hide_finished";
+ action, SIGNAL_EMIT SIGNAL_HIDE_FINISHED SOURCE_ELM;
+ }
+ }
+}
+
+group {
+ name, GRP_ACTION_MENU_TOP;
+ parts {
+ part {
+ name, "area";
+ type, SPACER;
+ scale, 1;
+ description {
+ state, "default" 0.0;
+ min, 500 346;
+ }
+ }
+ part {
+ name, "padding.livetv.btn";
+ type, SPACER;
+ scale, 1;
+ description {
+ state, "default" 0.0;
+ rel2.relative, 1.0 0.0;
+ min, 0 120;
align, 0.5 0.0;
fixed, 0 1;
}
}
rel2.to, "padding.livetv.btn";
min, 0 1;
- align, 0.5 1.0;
+ align, 0.0 1.0;
fixed, 0 1;
}
}
scale, 1;
description {
state, "default" 0.0;
- rel1 {
- to, PART_MENU;
- relative, 0.0 0.0;
- }
- rel2 {
- to, PART_MENU;
- relative, 1.0 1.0;
- }
+ rel1.to, PART_MENU;
+ rel2.to, PART_MENU;
align, 0.0 0.0;
- fixed, 1 1;
color, 224 224 224 255;
}
}
state, "default" 0.0;
rel1 {
to, "padding.menu.divider.up";
- relative, 0.0 1.0;
+ relative, 0.5 1.0;
}
rel2 {
to, "padding.menu.divider.up";
- relative, 0.0 1.0;
+ relative, 0.5 1.0;
}
- min, 500 0;
- align, 0.0 0.0;
+ min, 500 126;
+ align, 0.5 0.0;
fixed, 1 1;
}
}
fixed, 1 1;
}
}
+ }
+}
+group {
+ name, GRP_ACTION_MENU_BOTTOM;
+ parts {
part {
- name, PART_FAVORITE;
- type, SWALLOW;
+ name, "padding.more.btn";
+ type, SPACER;
scale, 1;
description {
state, "default" 0.0;
- rel1 {
- to, "padding.favorite.list";
- relative, 0.5 1.0;
- }
- rel2 {
- to, "padding.favorite.list";
- relative, 0.5 1.0;
- }
- min, 440 0;
- align, 0.5 0.0;
- fixed, 1 1;
+ rel1.relative, 0.0 0.0;
+ rel2.relative, 1.0 0.0;
+ min, 0 116;
+ align, 0.0 0.0;
+ fixed, 1 0;
}
}
part {
- name, "padding.favorite.list_bottom";
- type, SPACER;
+ name, PART_MORE_BUTTON;
+ type, SWALLOW;
scale, 1;
description {
state, "default" 0.0;
rel1 {
- to, "menu_area";
- relative, 0.0 1.0;
+ to, "padding.more.btn";
+ relative, 0.5 0.5;
}
rel2 {
- to, "menu_area";
- relative, 1.0 1.0;
+ to, "padding.more.btn";
+ relative, 0.5 0.5;
}
- min, 0 32;
- align, 0.0 1.0;
+ min, 184 60;
+ align, 0.5 0.5;
fixed, 1 1;
}
}
+ }
+}
+group {
+ name, GRP_ACTION_MENU_NO_FAVORITE;
+ parts {
part {
name, "part.favorite.no_favorite";
type, RECT;
scale, 1;
description {
state, "default" 0.0;
- rel1 {
- to, "padding.favorite.list";
- relative, 0.5 1.0;
- }
- rel2 {
- to, "padding.favorite.list_bottom";
- relative, 0.5 0.0;
- }
- min, 440 0;
+ rel1.relative, 0.5 0.0;
+ rel2.relative, 0.5 0.0;
+ min, 440 616;
align, 0.5 0.0;
- fixed, 1 1;
color, COLOR_NOFAVORITE_BG;
- visible, 0;
- }
- description {
- state, "no_favorite" 0.0;
- inherit, "default" 0.0;
- visible, 1;
- }
-
- part {
- name, "part.favorite.no_favorite.text";
- type, TEXT;
- scale, 1;
- description {
- state, "default" 0.0;
- text {
- font, FONT_LIGHT;
- size, 28;
- align, 0.5 0.5;
- text, STR_NOFAVORITE;
- }
- color, COLOR_NOFAVORITE_TEXT;
- visible, 0;
- }
- description {
- state, "no_favorite" 0.0;
- inherit, "default" 0.0;
- visible, 1;
- }
}
}
-
part {
- name, "padding.channelinfo";
- type, SPACER;
- scale, 1;
- description {
- state, "default" 0.0;
- rel1.relative, 0.0 0.0;
- rel2.relative, 0.0 0.0;
- min, 40 40;
- align, 0.0 0.0;
- fixed, 1 1;
- }
- }
-
- part {
- name, PART_CHANNELINFO;
- type, SWALLOW;
+ name, "part.favorite.no_favorite.text";
+ type, TEXT;
scale, 1;
description {
state, "default" 0.0;
- rel1 {
- to, "padding.channelinfo";
- relative, 1.0 1.0;
- }
- rel2 {
- to, "padding.channelinfo";
- relative, 1.0 1.0;
+ rel1.to, "part.favorite.no_favorite";
+ rel2.to, "part.favorite.no_favorite";
+ text {
+ font, FONT_LIGHT;
+ size, 28;
+ align, 0.5 0.5;
+ text, STR_NOFAVORITE;
}
- min, 536 174;
- align, 0.0 0.0;
- fixed, 1 1;
+ color, COLOR_NOFAVORITE_TEXT;
}
}
}
-
- programs {
- program {
- signal, SIGNAL_SHOW;
- action, STATE_SET "show" 0.0;
- target, "menu_area";
- transition, CUBIC_BEZIER 0.667 TRANSITION_EASE_IN_OUT;
- }
- program {
- signal, SIGNAL_HIDE;
- source, SOURCE_ELM;
- action, STATE_SET "default" 0.0;
- target, "menu_area";
- transition, CUBIC_BEZIER 0.334 TRANSITION_EASE_OUT;
- after, "hide_finished";
- }
- program {
- name, "hide_finished";
- action, SIGNAL_EMIT SIGNAL_HIDE_FINISHED SOURCE_ELM;
- }
- program {
- name, "no_favorite";
- signal, SIGNAL_NO_FAVORITE;
- source, SOURCE_ELM;
- action, STATE_SET "no_favorite" 0.0;
- target, "part.favorite.no_favorite";
- target, "part.favorite.no_favorite.text";
- }
- program {
- name, "favorite";
- signal, SIGNAL_FAVORITE;
- action, STATE_SET "default" 0.0;
- source, SOURCE_ELM;
- target, "part.favorite.no_favorite";
- target, "part.favorite.no_favorite.text";
- }
- }
}
#define BUTTON_BORDER 1
#define ITEMS_IN_ROW 4
#define FAVORITE_PADDING_Y 32
+#define FAVORITE_MAX 10
+#define SCROLLER_STEP_SIZE 334
+
+#define TAG_FAVORITE "TAG_FAVORITE"
#define STYLE_LIVETV_BTN "style.livetv.button"
#define STYLE_ACTION_MENU_BTN "style.action.menu.button"
enum _button_id {
BUTTON_INVALID = -1,
BUTTON_LIVETV,
+ BUTTON_MORE,
BUTTON_FAV,
BUTTON_LOCK,
BUTTON_CHANNEL,
struct _priv {
Evas_Object *win;
Evas_Object *base;
+ Evas_Object *scroller;
+ Evas_Object *box;
+ Evas_Object *menu;
Evas_Object *channel_info;
Evas_Object *menu_btn[BUTTON_MAX];
Evas_Object *favorite;
static input_handler button_handler = {
.key_up = _button_key_up_cb,
.mouse_up = _button_mouse_up_cb,
- .mouse_move = _button_mouse_move_cb
+ .mouse_move = _button_mouse_move_cb,
};
static void _favorite_clicked_cb(int id, void *data, Evas_Object *obj)
{
Eina_List *channel_list, *l;
const struct tv_channel_info *channel_info;
- Evas_Object *btn, *obj;
+ Evas_Object *btn, *no_favorite;
char buf[BUF_MAX];
int i;
channel_list = tv_channel_get_favorite_list();
- i = 0;
- while ((obj = elm_table_child_get(priv->favorite, 0, i++)))
- inputmgr_remove_callback(obj, &favorite_handler);
-
- elm_table_clear(priv->favorite, EINA_TRUE);
+ inputmgr_remove_all_by_tag(TAG_FAVORITE);
+ elm_box_clear(priv->favorite);
if (!channel_list) {
- elm_object_signal_emit(priv->base,
- SIGNAL_NO_FAVORITE, SOURCE_ELM);
+ no_favorite = util_add_layout(priv->favorite,
+ GRP_ACTION_MENU_NO_FAVORITE);
+ if (!no_favorite) {
+ _ERR("failed to create no favorite layout");
+ return;
+ }
+
+ elm_box_pack_end(priv->favorite, no_favorite);
+
return;
}
- elm_object_signal_emit(priv->base, SIGNAL_FAVORITE, SOURCE_ELM);
-
i = 0;
EINA_LIST_FOREACH(channel_list, l, channel_info) {
if (channel_info->channel_minor > 0 &&
snprintf(buf, sizeof(buf), "%lu %s",
channel_info->channel_major,
channel_info->channel_name);
- btn = util_add_button(priv->base, NULL, buf,
+ btn = util_add_button(priv->menu, NULL, buf,
STYLE_ACTION_MENU_FAVORITE);
if (!btn) {
- _ERR("Add button failed.");
+ _ERR("failed to create favorite item");
continue;
}
util_add_icon(btn, IMAGE_FAVORITE_DEFAULT, PART_CONTENT);
inputmgr_add_callback(btn, channel_info->service_id,
&favorite_handler, NULL);
+ inputmgr_set_tags(btn, TAG_FAVORITE);
+
+ elm_box_pack_end(priv->favorite, btn);
- elm_table_pack(priv->favorite, btn, 0, i++, 1, 1);
+ if (++i == FAVORITE_MAX)
+ break;
}
tv_channel_del_list(channel_list);
layout = util_add_layout(priv->base, GRP_CHANNELINFO);
if (!layout) {
- _ERR("Add layout failed.");
+ _ERR("failed to create channel info layout");
return false;
}
return true;
}
-static bool _draw_top_area(struct _priv *priv)
-{
- Evas_Object *btn;
-
- btn = util_add_button(priv->base,
- PART_TOP_BUTTON, STR_LIVETV, STYLE_LIVETV_BTN);
- if (!btn) {
- _ERR("Add button failed.");
- return false;
- }
-
- elm_object_disabled_set(btn, EINA_TRUE);
-
- return true;
-}
-
-static bool _draw_menu_area(struct _priv *priv)
+static bool _draw_action_area(struct _priv *priv)
{
Evas_Object *table, *btn;
int i, row, col;
- table = elm_table_add(priv->base);
+ table = elm_table_add(priv->menu);
if (!table) {
- _ERR("Add table failed.");
+ _ERR("failed to create action table");
return false;
}
elm_table_padding_set(table, BUTTON_BORDER, BUTTON_BORDER);
evas_object_show(table);
- elm_object_part_content_set(priv->base, PART_MENU, table);
+ elm_object_part_content_set(priv->menu, PART_MENU, table);
i = 0;
while (buttons[i].id != BUTTON_INVALID && i < BUTTON_MAX) {
- btn = util_add_button(priv->base, NULL,
+ btn = util_add_button(priv->menu, NULL,
buttons[i].data[UNTOGGLE].text,
buttons[i].style);
if (!btn) {
- _ERR("Add button failed.");
+ _ERR("failed to create action button");
evas_object_del(table);
return false;
}
i++;
}
- elm_object_focus_next_object_set(priv->menu_btn[0],
- priv->menu_btn[i - 1], ELM_FOCUS_LEFT);
- elm_object_focus_next_object_set(priv->menu_btn[i - 1],
- priv->menu_btn[0], ELM_FOCUS_RIGHT);
-
while (col + 1 != ITEMS_IN_ROW) {
- btn = util_add_button(priv->base, NULL, NULL,
+ btn = util_add_button(priv->menu, NULL, NULL,
STYLE_ACTION_MENU_BTN);
if (!btn) {
- _ERR("Add button failed.");
+ _ERR("failed to create action button");
evas_object_del(table);
return false;
}
return true;
}
+static bool _draw_top_area(struct _priv *priv)
+{
+ Evas_Object *layout, *btn;
+
+ layout = util_add_layout(priv->box, GRP_ACTION_MENU_TOP);
+ if (!layout) {
+ _ERR("failed to create menu layout");
+ return false;
+ }
+ elm_box_pack_end(priv->box, layout);
+
+ btn = util_add_button(layout,
+ PART_TOP_BUTTON, STR_LIVETV, STYLE_LIVETV_BTN);
+ if (!btn) {
+ _ERR("failed to create live button");
+ return false;
+ }
+
+ elm_object_disabled_set(btn, EINA_TRUE);
+
+ priv->menu = layout;
+
+ return _draw_action_area(priv);
+}
+
+static bool _draw_favorite_area(struct _priv *priv)
+{
+ Evas_Object *box;
+
+ box = elm_box_add(priv->box);
+ if (!box) {
+ _ERR("failed to create favorite box");
+ return false;
+ }
+ elm_box_padding_set(box, 0, FAVORITE_PADDING_Y);
+ evas_object_show(box);
+ elm_box_pack_end(priv->box, box);
+
+ priv->favorite = box;
+
+ return true;
+}
+
static bool _draw_bottom_area(struct _priv *priv)
{
- Evas_Object *table;
+ Evas_Object *layout, *btn;
- table = elm_table_add(priv->base);
- if (!table) {
- _ERR("Add table failed.");
+ layout = util_add_layout(priv->box, GRP_ACTION_MENU_BOTTOM);
+ if (!layout) {
+ _ERR("failed to create menu layout");
return false;
}
- elm_table_padding_set(table, 0, FAVORITE_PADDING_Y);
- evas_object_show(table);
- elm_object_part_content_set(priv->base, PART_FAVORITE, table);
+ elm_box_pack_end(priv->box, layout);
- priv->favorite = table;
+ btn = util_add_button(layout,
+ PART_MORE_BUTTON, STR_BUTTON_MORE, STYLE_LIVETV_BTN);
+ if (!btn) {
+ _ERR("failed to create more button");
+ return false;
+ }
return true;
}
static void _draw_view_content(struct _priv *priv)
{
if (!_draw_channel_info(priv)) {
- _ERR("Draw channel info failed.");
+ _ERR("failed to draw channel info");
return;
}
if (!_draw_top_area(priv)) {
- _ERR("Draw top area failed.");
+ _ERR("failed to draw top");
return;
}
- if (!_draw_menu_area(priv)) {
- _ERR("Draw menu area failed.");
+ if (!_draw_favorite_area(priv)) {
+ _ERR("failed to draw favorite");
return;
}
if (!_draw_bottom_area(priv))
- _ERR("Draw bottom area failed.");
+ _ERR("failed to draw bottom");
}
static void _hide_finished_cb(void *data, Evas_Object *obj,
static Evas_Object *_create(Evas_Object *win, void *data)
{
struct _priv *priv;
- Evas_Object *base;
+ Evas_Object *base, *scroller, *box;
if (!win) {
- _ERR("Get window object failed.");
+ _ERR("failed to get win object");
return NULL;
}
priv = calloc(1, sizeof(*priv));
if (!priv) {
- _ERR("Calloc failed.");
+ _ERR("failed to allocate priv");
return NULL;
}
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, base);
+ scroller = util_add_scroller(base, NULL);
+ elm_scroller_step_size_set(scroller, 0, SCROLLER_STEP_SIZE);
+
+ box = util_add_box(scroller, NULL);
+ elm_box_align_set(box, 0.5, 0.0);
+
+ priv->box = box;
+ priv->scroller = scroller;
priv->base = base;
priv->win = win;
- if (!viewmgr_set_view_data(VIEW_ACTION_MENU, priv)) {
- _ERR("Set view data failed.");
- evas_object_del(base);
- free(priv);
- return NULL;
- }
-
_draw_view_content(priv);
+ viewmgr_set_view_data(VIEW_ACTION_MENU, priv);
inputmgr_add_callback(priv->base, 0, &key_handler, priv);
elm_layout_signal_callback_add(priv->base, SIGNAL_HIDE_FINISHED,
SOURCE_ELM, _hide_finished_cb, priv);
struct _priv *priv;
if (!data) {
- _ERR("Get data failed.");
+ _ERR("failed to get data");
return;
}
priv = data;
_update_menu(priv);
_update_favorite(priv);
+ elm_scroller_region_show(priv->scroller, 0, 0, 0, 0);
+
evas_object_show(priv->base);
elm_object_focus_set(priv->menu_btn[0], EINA_TRUE);
struct _priv *priv;
if (!data) {
- _ERR("Get data failed.");
+ _ERR("failed to get data");
return;
}
priv = data;
static void _destroy(void *data)
{
struct _priv *priv;
- Evas_Object *obj;
int i;
if (!data) {
- _ERR("Get data failed.");
+ _ERR("failed to get data");
return;
}
priv = data;
i++;
}
- i = 0;
- while ((obj = elm_table_child_get(priv->favorite, 0, i++)))
- inputmgr_remove_callback(obj, &favorite_handler);
+ inputmgr_remove_all_by_tag(TAG_FAVORITE);
evas_object_del(priv->base);