listmgr: add input handler for play info 72/44272/1
authorJehun Lim <jehun.lim@samsung.com>
Mon, 20 Jul 2015 11:10:46 +0000 (20:10 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Mon, 20 Jul 2015 11:10:46 +0000 (20:10 +0900)
Change-Id: Ia9f4f33ba2823994a1e77f7264e3c2a204eb2ec2
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
include/util/listmgr.h
src/layout/movie.c
src/util/listmgr.c

index 3567dd0..50491bb 100644 (file)
@@ -22,6 +22,8 @@ struct listmgr;
 struct play_info_ops {
        bool (*draw)(void *data, Evas_Object *base);
        bool (*update)(void *data, Evas_Object *base);
+
+       void (*selected_cb)(void *data, Evas_Object *obj);
        void *ops_data;
 };
 
index 710f8d1..20f623e 100644 (file)
@@ -57,7 +57,7 @@ struct _priv {
 
        Eina_List *media_list;
 
-       app_media_info *recent_info;
+       app_media *recent_info;
 };
 
 static char *_grid_text_get(void *data, Evas_Object *obj, const char *part)
@@ -149,7 +149,11 @@ static bool _update_recent(void *data, Evas_Object *base)
                return false;
        }
 
-       info = priv->recent_info;
+       info = app_media_get_info(priv->recent_info);
+       if (!info) {
+               _ERR("failed to get app media info");
+               return false;
+       }
 
        elm_image_file_set(image, info->thumbnail_path, NULL);
        elm_image_aspect_fixed_set(image, EINA_FALSE);
@@ -248,10 +252,32 @@ static bool _draw_recent(void *data, Evas_Object *base)
        return true;
 }
 
+static void _item_selected_cb(struct _priv *priv, app_media *am)
+{
+       struct view_update_data vdata;
+
+       vdata.list = mediadata_get_medialist(priv->md);
+       vdata.index = util_get_media_index(vdata.list, am);
+
+       viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata);
+       viewmgr_push_view(VIEW_VIEWER);
+}
+
+static void _recent_selected_cb(void *data, Evas_Object *obj)
+{
+       struct _priv *priv;
+
+       if (!data || !obj)
+               return;
+
+       priv = data;
+
+       _item_selected_cb(priv, priv->recent_info);
+}
+
 static void _grid_selected_cb(void *data, Elm_Object_Item *it)
 {
        app_media *am;
-       struct view_update_data vdata;
        struct _priv *priv;
 
        if (!data || !it) {
@@ -267,11 +293,7 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it)
                return;
        }
 
-       vdata.list = mediadata_get_medialist(priv->md);
-       vdata.index = util_get_media_index(vdata.list, am);
-
-       viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata);
-       viewmgr_push_view(VIEW_VIEWER);
+       _item_selected_cb(priv, am);
 }
 
 static struct listmgr_data *_create_listmgr_data(struct _priv *priv)
@@ -297,6 +319,7 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv)
 
        pops->draw = _draw_recent;
        pops->update = _update_recent;
+       pops->selected_cb = _recent_selected_cb;
        pops->ops_data = priv;
 
        gops = calloc(1, sizeof(*gops));
index 5a63907..181b362 100644 (file)
@@ -31,6 +31,7 @@
 enum _object_type {
        LISTMGR_SCROLLER = 0,
        LISTMGR_INDEX,
+       LISTMGR_PLAY_INFO,
        LISTMGR_GRID
 };
 
@@ -78,6 +79,7 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj,
 
        switch (id) {
        case LISTMGR_INDEX:
+       case LISTMGR_PLAY_INFO:
                if (!elm_object_focus_get(obj)) {
                        lmgr->scr_focus = EINA_FALSE;
                        elm_object_focus_set(obj, EINA_TRUE);
@@ -102,6 +104,36 @@ 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)
+{
+       if (!obj)
+               return;
+
+       switch (id) {
+       case LISTMGR_PLAY_INFO:
+               elm_object_signal_emit(obj, SIG_BTN_CLICKED, SIG_SOURCE_SRC);
+               break;
+       default:
+               break;
+       }
+}
+
+static void _play_info_selected_cb(void *data, Evas_Object *obj,
+                       const char *emission, const char *source)
+{
+       struct listmgr *lmgr;
+       struct play_info_ops *pops;
+
+       if (!data || !obj)
+               return;
+
+       lmgr = data;
+       pops = lmgr->data->pops;
+
+       if (pops->selected_cb)
+               pops->selected_cb(pops->ops_data, obj);
+}
+
 static void _grid_selected_cb(void *data, Elm_Object_Item *it,
                        const char *emission, const char *source)
 {
@@ -167,6 +199,7 @@ static void _focused_cb(int id, void *data, Evas_Object *obj,
 
                break;
        case LISTMGR_INDEX:
+       case LISTMGR_PLAY_INFO:
        case LISTMGR_GRID:
                lmgr->focused =  elm_object_parent_widget_get(obj);
                lmgr->scr_focus = EINA_TRUE;
@@ -189,6 +222,7 @@ static input_handler _grid_handler = {
 static input_handler _handler = {
        .key_down = _key_down_cb,
        .mouse_move = _mouse_move_cb,
+       .clicked = _clicked_cb,
        .focused = _focused_cb
 };
 
@@ -216,7 +250,7 @@ static int _get_grid_size(int count, int num_item)
 
 static bool _draw_play_info(struct listmgr *lmgr)
 {
-       Evas_Object *ly;
+       Evas_Object *ly, *index, *content;
        struct play_info_ops *pops;
 
        ly = elm_layout_add(lmgr->box);
@@ -235,6 +269,18 @@ static bool _draw_play_info(struct listmgr *lmgr)
                return false;
        }
 
+       index = elm_object_part_content_get(ly, PART_ITEM_TITLE);
+
+       inputmgr_add_callback(index, LISTMGR_INDEX, &_handler, lmgr);
+       elm_object_focus_next_object_set(index, lmgr->data->menu_btn,
+                                       ELM_FOCUS_UP);
+
+       content = elm_object_part_content_get(ly, PART_ITEM_CONTENT);
+
+       inputmgr_add_callback(content, LISTMGR_PLAY_INFO, &_handler, lmgr);
+       elm_object_signal_callback_add(content, SIG_ITEM_SELECTED,
+                               SIG_SOURCE_EDC, _play_info_selected_cb, lmgr);
+
        lmgr->play_info = ly;
 
        return true;
@@ -416,6 +462,7 @@ bool listmgr_update_play_info(struct listmgr *lmgr, app_media_info *info)
                elm_box_pack_start(lmgr->box, lmgr->play_info);
                evas_object_show(lmgr->play_info);
                lmgr->show_play_info = EINA_TRUE;
+               lmgr->focused = lmgr->play_info;
        }
 
        return true;
@@ -507,13 +554,29 @@ struct listmgr *listmgr_create(Evas_Object *base, void *data)
 void listmgr_destroy(struct listmgr *lmgr)
 {
        Eina_List *item, *l;
-       Evas_Object *ly, *btn, *grid;
+       Evas_Object *ly, *btn, *content, *grid;
 
        if (!lmgr) {
                _ERR("invalid argument");
                return;
        }
 
+       if (lmgr->play_info) {
+               btn = elm_object_part_content_get(lmgr->play_info,
+                                       PART_ITEM_TITLE);
+               content = elm_object_part_content_get(lmgr->play_info,
+                                       PART_ITEM_CONTENT);
+
+               inputmgr_remove_callback(btn, &_handler);
+               inputmgr_remove_callback(content, &_handler);
+
+               elm_object_signal_callback_del(content, SIG_ITEM_SELECTED,
+                                       SIG_SOURCE_EDC, _play_info_selected_cb);
+
+               elm_box_unpack(lmgr->box, lmgr->play_info);
+               evas_object_del(lmgr->play_info);
+       }
+
        item = elm_box_children_get(lmgr->box);
        EINA_LIST_FOREACH(item, l, ly) {
                btn = elm_object_part_content_get(ly, PART_ITEM_TITLE);