#define SCROLLER_STEP_SIZE(x) ((x) + 10)
enum _object_type {
- LISTMGR_GRID = 0,
+ LISTMGR_SCROLLER = 0,
+ LISTMGR_INDEX,
+ LISTMGR_GRID
};
struct listmgr {
Evas_Object *base;
+ Evas_Object *scr;
Evas_Object *box;
Evas_Object *play_info;
+ Evas_Object *focused;
struct gridmgr *gmgr;
struct listmgr_data *data;
Eina_Bool show_play_info;
+ Eina_Bool scr_focus;
};
-void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj,
+static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
+ Evas_Event_Key_Down *ev)
+{
+ if (!obj || !ev)
+ return;
+
+ switch (id) {
+ case LISTMGR_INDEX:
+ if (!strcmp(ev->keyname, KEY_BACK) ||
+ !strcmp(ev->keyname, KEY_BACK_REMOTE))
+ elm_object_focus_next(obj, ELM_FOCUS_UP);
+ break;
+ default:
+ break;
+ }
+}
+
+static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj,
Evas_Event_Mouse_Move *ev)
{
Elm_Object_Item *it;
+ struct listmgr *lmgr;
- if (!obj || !ev)
+ if (!data || !obj || !ev)
return;
+ lmgr = data;
+
switch (id) {
+ case LISTMGR_INDEX:
+ if (!elm_object_focus_get(obj)) {
+ lmgr->scr_focus = EINA_FALSE;
+ elm_object_focus_set(obj, EINA_TRUE);
+ }
+
+ break;
case LISTMGR_GRID:
it = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x,
ev->cur.canvas.y, NULL, NULL);
if (!it)
return;
- if (!elm_object_item_focus_get(it))
+ if (!elm_object_item_focus_get(it)) {
+ lmgr->scr_focus = EINA_FALSE;
elm_object_item_focus_set(it, EINA_TRUE);
+ }
break;
default:
}
}
-void _grid_selected_cb(void *data, Elm_Object_Item *it,
+static void _grid_selected_cb(void *data, Elm_Object_Item *it,
const char *emission, const char *source)
{
struct listmgr *lmgr;
elm_gengrid_item_selected_set(it, EINA_FALSE);
}
-void _grid_realized_cb(int id, void *data, Evas_Object *obj,
+static void _grid_realized_cb(int id, void *data, Evas_Object *obj,
Elm_Object_Item *it)
{
if (!data || !it)
SIG_SOURCE_EDC, _grid_selected_cb, data);
}
-void _grid_unrealized_cb(int id, void *data, Evas_Object *obj,
+static void _grid_unrealized_cb(int id, void *data, Evas_Object *obj,
Elm_Object_Item *it)
{
if (!it)
SIG_SOURCE_EDC, _grid_selected_cb);
}
+static void _focused_cb(int id, void *data, Evas_Object *obj,
+ Elm_Object_Item *it)
+{
+ Evas_Object *btn;
+ struct listmgr *lmgr;
+
+ if (!data || !obj)
+ return;
+
+ lmgr = data;
+
+ switch (id) {
+ case LISTMGR_SCROLLER:
+ if (!lmgr->scr_focus)
+ break;
+
+ btn = elm_object_part_content_get(lmgr->focused,
+ PART_ITEM_TITLE);
+ if (!btn) {
+ _ERR("failed to get button object");
+ return;
+ }
+
+ elm_object_focus_set(btn, EINA_TRUE);
+
+ break;
+ case LISTMGR_INDEX:
+ case LISTMGR_GRID:
+ lmgr->focused = elm_object_parent_widget_get(obj);
+ lmgr->scr_focus = EINA_TRUE;
+ break;
+ default:
+ break;
+ }
+}
+
static input_handler _grid_handler = {
.mouse_move = _mouse_move_cb,
+ .focused = _focused_cb,
.realized = _grid_realized_cb,
.unrealized = _grid_unrealized_cb
};
+static input_handler _handler = {
+ .key_down = _key_down_cb,
+ .mouse_move = _mouse_move_cb,
+ .focused = _focused_cb
+};
+
+static Evas_Object *_get_box_first_item(Evas_Object *box)
+{
+ Eina_List *list;
+
+ list = elm_box_children_get(box);
+ if (!list)
+ return NULL;
+
+ return (Evas_Object *)eina_list_nth(list, 0);
+}
+
static int _get_grid_size(int count, int num_item)
{
int size;
snprintf(buf, sizeof(buf), " %s ", gi->name);
elm_object_text_set(btn, buf);
+ elm_object_focus_next_object_set(btn,
+ lmgr->data->menu_btn, ELM_FOCUS_UP);
+
+ inputmgr_add_callback(btn, LISTMGR_INDEX, &_handler, lmgr);
+
grid = util_add_gengrid(ly, data->grid_item_x, data->grid_item_y);
if (!grid) {
_ERR("failed to create gengrid object");
}
elm_gengrid_item_bring_in(it, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE);
- elm_object_focus_set(grid, EINA_TRUE);
+
+ lmgr->scr_focus = EINA_FALSE;
elm_object_item_focus_set(it, EINA_TRUE);
return true;
bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list)
{
- Evas_Object *ly;
+ Evas_Object *ly, *btn, *grid;
Eina_List *l;
struct group_info *gi;
return false;
}
+ ly = NULL;
EINA_LIST_FOREACH(list, l, gi) {
ly = _draw_list_item(lmgr, gi);
if (!ly) {
elm_box_pack_end(lmgr->box, ly);
}
+ btn = elm_object_part_content_get(ly, PART_ITEM_TITLE);
+ elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT);
+
+ grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT);
+ elm_object_focus_next_object_set(grid, grid, ELM_FOCUS_RIGHT);
+
+ lmgr->focused = _get_box_first_item(lmgr->box);
+
return true;
}
if (!info) {
if (lmgr->show_play_info) {
+ if (lmgr->play_info == lmgr->focused)
+ lmgr->focused = _get_box_first_item(lmgr->box);
+
elm_box_unpack(lmgr->box, lmgr->play_info);
evas_object_hide(lmgr->play_info);
lmgr->show_play_info = EINA_FALSE;
elm_scroller_step_size_set(scr,
SCROLLER_STEP_SIZE(lmgr->data->box_padding), 0);
+ inputmgr_add_callback(scr, LISTMGR_SCROLLER, &_handler, lmgr);
+
box = util_add_box(scr);
if (!box) {
_ERR("failed to create box object");
elm_object_part_content_set(lmgr->base, PART_CONTENT, scr);
+ lmgr->scr = scr;
lmgr->box = box;
if (lmgr->data->pops) {
}
}
+ elm_object_focus_next_object_set(lmgr->data->menu_btn, scr,
+ ELM_FOCUS_DOWN);
+
return true;
}
lmgr->gmgr = gmgr;
lmgr->data = (struct listmgr_data *)data;
lmgr->show_play_info = EINA_FALSE;
+ lmgr->scr_focus = EINA_TRUE;
return lmgr;
}
void listmgr_destroy(struct listmgr *lmgr)
{
+ Eina_List *item, *l;
+ Evas_Object *ly, *btn, *grid;
+
if (!lmgr) {
_ERR("invalid argument");
return;
}
+ item = elm_box_children_get(lmgr->box);
+ EINA_LIST_FOREACH(item, l, ly) {
+ btn = elm_object_part_content_get(ly, PART_ITEM_TITLE);
+ grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT);
+
+ inputmgr_remove_callback(btn, &_handler);
+ inputmgr_remove_callback(grid, &_grid_handler);
+ }
+
+ inputmgr_remove_callback(lmgr->scr, &_handler);
+
gridmgr_destroy(lmgr->gmgr);
free(lmgr);
struct _menu_item {
const char *name;
const char *layout_id;
+ layout_class *(*func_get_lclass)(void);
};
static struct _menu_item g_menu_item[MENU_BTN_SIZE] = {
{
"Movie",
- LAYOUT_MOVIE
+ LAYOUT_MOVIE,
+ layout_movie_get_lclass
},
{
"Gallery",
- LAYOUT_GALLERY
+ LAYOUT_GALLERY,
+ layout_gallery_get_lclass
},
{
"Music",
- LAYOUT_MUSIC
+ LAYOUT_MUSIC,
+ layout_music_get_lclass
}
};
+static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
+ Evas_Event_Key_Down *ev)
+{
+ if (!obj || !ev)
+ return;
+
+ if (!strcmp(ev->keyname, KEY_ENTER) ||
+ !strcmp(ev->keyname, KEY_ENTER_REMOTE))
+ elm_object_focus_next(obj, ELM_FOCUS_DOWN);
+}
+
static void _mouse_move_cb(int id, void *data, Evas *e,
Evas_Object *obj, Evas_Event_Mouse_Move *ev)
{
}
static input_handler handler = {
+ .key_down = _key_down_cb,
.mouse_move = _mouse_move_cb,
.focused = _focused_cb
};
elm_object_part_content_set(priv->base, PART_MENU_AREA, box);
- elm_object_focus_set(priv->btn[0], EINA_TRUE);
-
elm_object_focus_next_object_set(priv->btn[MENU_BTN_SIZE - 1],
priv->btn[0], ELM_FOCUS_RIGHT);
elm_object_focus_next_object_set(priv->btn[0],
struct _priv *priv;
Evas_Object *base;
layoutmgr *lmgr;
+ int i;
if (!win) {
_ERR("failed to get win object");
elm_layout_file_set(base, EDJEFILE, GRP_BASE_VIEW);
- evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, base);
- lmgr = layoutmgr_create(base);
- layoutmgr_add_layout(lmgr, layout_movie_get_lclass(), NULL);
- layoutmgr_add_layout(lmgr, layout_gallery_get_lclass(), NULL);
- layoutmgr_add_layout(lmgr, layout_music_get_lclass(), NULL);
-
priv->win = win;
priv->base = base;
- priv->lmgr = lmgr;
if (!_draw_items(priv)) {
_ERR("failed to draw items");
return NULL;
}
+ lmgr = layoutmgr_create(base);
+ for (i = 0; i < MENU_BTN_SIZE; i++)
+ layoutmgr_add_layout(lmgr, g_menu_item[i].func_get_lclass(),
+ priv->btn[i]);
+
+ priv->lmgr = lmgr;
+
viewmgr_set_view_data(VIEW_BASE, priv);
+ elm_object_focus_set(priv->btn[0], EINA_TRUE);
+
return base;
}