listmgr: add callback functions for grid item 36/43336/1
authorJehun Lim <jehun.lim@samsung.com>
Wed, 8 Jul 2015 07:11:16 +0000 (16:11 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Wed, 8 Jul 2015 07:17:30 +0000 (16:17 +0900)
: mouse move, realized, unrealized, selected

Change-Id: If07433cafb4c94417350c6ec3bf355d28c38e6d1
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
include/data/mediadata.h
include/define.h
include/util/listmgr.h
include/util/util.h
include/view.h
res/edc/widgets/gengrid.edc
src/data/mediadata.c
src/layout/gallery.c
src/layout/movie.c
src/util/listmgr.c
src/util/util.c

index 45fff25..c9f15c8 100644 (file)
@@ -50,6 +50,8 @@ struct mediadata *mediadata_create(const char *media_type,
                        int source_type, int sort_type);
 void mediadata_destroy(struct mediadata *md);
 
+Eina_List *mediadata_get_medialist(struct mediadata *md);
+
 Eina_List *mediadata_get_list(struct mediadata *md, int list_type);
 void mediadata_free_list(Eina_List *list);
 
index 1b4651b..905eaea 100644 (file)
@@ -52,4 +52,8 @@
 #define PART_ELM_SWALLOW_THUMBNAIL "elm.swallow.thumbnail"
 #define PART_ELM_SWALLOW_VIDEO "elm.swallow.video"
 
+/* signal */
+#define SIG_ITEM_SELECTED "item_selected"
+#define SIG_SOURCE_EDC "edc"
+
 #endif /* __AIR_MEDIAHUB_DEFINE_H__ */
index 4889e3d..ad0a8ce 100644 (file)
@@ -27,6 +27,9 @@ struct listmgr_data {
        int box_padding;
 
        struct grid_class *gclass;
+
+       void (*grid_selected_cb)(void *data, Elm_Object_Item *it);
+       void *cb_data;
 };
 
 struct listmgr *listmgr_create(Evas_Object *base, void *data);
index aebcb74..ee354f7 100644 (file)
@@ -26,4 +26,6 @@ Evas_Object *util_add_scroller(Evas_Object *base);
 void util_time_string(char *str, int size, unsigned int ms);
 void util_up_string(char *str);
 
+int util_get_media_index(Eina_List *list, void *info);
+
 #endif /* __AIR_MEDIAHUB_UTIL_H__ */
index aabb6ae..afa40e8 100644 (file)
@@ -23,4 +23,16 @@ view_class *view_base_get_vclass(void);
 /* viewer */
 view_class *view_viewer_get_vclass(void);
 
+/* view data */
+struct view_data {
+       Eina_List *list;
+       int index;
+};
+
+/* view update type */
+enum update_type {
+       UPDATE_CONTENT = 0,
+       UPDATE_FOCUS
+};
+
 #endif /* __AIR_MEDIAHUB_VIEW_H__ */
index 624f553..51b9e77 100644 (file)
@@ -46,7 +46,7 @@ group {
                                visible: 0;
                        }
                        description {
-                               state: "clicked" 0.0;
+                               state: "selected" 0.0;
                                inherit: "default" 0.0;
                                perspective.zplane: -100;
                        }
@@ -388,6 +388,26 @@ group {
                        target: "part_focus3";
                        target: "elm.bg.text";
                }
+               program {
+                       name: "selected";
+                       signal: "elm,state,selected";
+                       source: "elm";
+                       action: STATE_SET "selected" 0.0;
+                       target: "map";
+                       transition: DECELERATE 0.2;
+                       after: "after_selected";
+               }
+               program {
+                       name: "after_selected";
+                       action: STATE_SET "default" 0.0;
+                       target: "map";
+                       transition: DECELERATE 0.2;
+                       after: "item_selected";
+               }
+               program {
+                       name: "item_selected";
+                       action: SIGNAL_EMIT SIG_ITEM_SELECTED SIG_SOURCE_EDC;
+               }
        }
 }
 
@@ -423,7 +443,7 @@ group {
                                visible: 0;
                        }
                        description {
-                               state: "clicked" 0.0;
+                               state: "selected" 0.0;
                                inherit: "default" 0.0;
                                perspective.zplane: -100;
                        }
@@ -732,5 +752,25 @@ group {
                        target: "part_focus3";
                        target: "part_focus4";
                }
+               program {
+                       name: "selected";
+                       signal: "elm,state,selected";
+                       source: "elm";
+                       action: STATE_SET "selected" 0.0;
+                       target: "map";
+                       transition: DECELERATE 0.2;
+                       after: "after_selected";
+               }
+               program {
+                       name: "after_selected";
+                       action: STATE_SET "default" 0.0;
+                       target: "map";
+                       transition: DECELERATE 0.2;
+                       after: "item_selected";
+               }
+               program {
+                       name: "item_selected";
+                       action: SIGNAL_EMIT SIG_ITEM_SELECTED SIG_SOURCE_EDC;
+               }
        }
 }
index 554c72f..ffb85ab 100644 (file)
@@ -421,6 +421,16 @@ void mediadata_destroy(struct mediadata *md)
        eina_list_free(md->media_list);
 }
 
+Eina_List *mediadata_get_medialist(struct mediadata *md)
+{
+       if (!md) {
+               _ERR("failed to get mediadata");
+               return NULL;
+       }
+
+       return md->media_list;
+}
+
 Eina_List *mediadata_get_list(struct mediadata *md, int list_type)
 {
        Eina_List *list, *l;
index 9dd4c73..2c6f7fe 100644 (file)
 #include <app_media.h>
 #include <gridmgr.h>
 #include <layoutmgr.h>
+#include <viewmgr.h>
 
 #include "define.h"
+#include "view.h"
 #include "data/mediadata.h"
 #include "util/listmgr.h"
 #include "util/util.h"
@@ -95,7 +97,39 @@ static struct grid_class _gclass = {
        .content_get = _grid_content_get
 };
 
-static struct listmgr_data *_create_listmgr_data(void)
+static void _grid_selected_cb(void *data, Elm_Object_Item *it)
+{
+       app_media *am;
+       struct view_data *vdata;
+       struct _priv *priv;
+
+       if (!data || !it) {
+               _ERR("invalid argument");
+               return;
+       }
+
+       priv = data;
+
+       am = elm_object_item_data_get(it);
+       if (!am) {
+               _ERR("failed to get app media");
+               return;
+       }
+
+       vdata = calloc(1, sizeof(*vdata));
+       if (!vdata) {
+               _ERR("failed to allocate view data");
+               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);
+}
+
+static struct listmgr_data *_create_listmgr_data(struct _priv *priv)
 {
        struct listmgr_data *data;
 
@@ -109,8 +143,12 @@ static struct listmgr_data *_create_listmgr_data(void)
        data->grid_item_y = GRID_ITEM_Y;
        data->grid_num_item = GRID_NUM_ITEM;
        data->box_padding = BOX_PADDING;
+
        data->gclass = &_gclass;
 
+       data->grid_selected_cb = _grid_selected_cb;
+       data->cb_data = priv;
+
        return data;
 }
 
@@ -170,7 +208,7 @@ static bool _create(layoutmgr *lmgr, void *data)
                goto err2;
        }
 
-       ldata = _create_listmgr_data();
+       ldata = _create_listmgr_data(priv);
        if (!ldata) {
                _ERR("failed to create listmgr data");
                goto err2;
index 326de60..f0d1478 100644 (file)
 #include <app_media.h>
 #include <gridmgr.h>
 #include <layoutmgr.h>
+#include <viewmgr.h>
 
 #include "define.h"
+#include "view.h"
 #include "data/mediadata.h"
 #include "util/listmgr.h"
 #include "util/util.h"
@@ -112,7 +114,39 @@ static struct grid_class _gclass = {
        .content_get = _grid_content_get
 };
 
-static struct listmgr_data *_create_listmgr_data(void)
+static void _grid_selected_cb(void *data, Elm_Object_Item *it)
+{
+       app_media *am;
+       struct view_data *vdata;
+       struct _priv *priv;
+
+       if (!data || !it) {
+               _ERR("invalid argument");
+               return;
+       }
+
+       priv = data;
+
+       am = elm_object_item_data_get(it);
+       if (!am) {
+               _ERR("failed to get app media");
+               return;
+       }
+
+       vdata = calloc(1, sizeof(*vdata));
+       if (!vdata) {
+               _ERR("failed to allocate view data");
+               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);
+}
+
+static struct listmgr_data *_create_listmgr_data(struct _priv *priv)
 {
        struct listmgr_data *data;
 
@@ -126,8 +160,12 @@ static struct listmgr_data *_create_listmgr_data(void)
        data->grid_item_y = GRID_ITEM_Y;
        data->grid_num_item = GRID_NUM_ITEM;
        data->box_padding = BOX_PADDING;
+
        data->gclass = &_gclass;
 
+       data->grid_selected_cb = _grid_selected_cb;
+       data->cb_data = priv;
+
        return data;
 }
 
@@ -187,7 +225,7 @@ static bool _create(layoutmgr *lmgr, void *data)
                goto err2;
        }
 
-       ldata = _create_listmgr_data();
+       ldata = _create_listmgr_data(priv);
        if (!ldata) {
                _ERR("failed to create listmgr data");
                goto err2;
index b5ca603..a340e1f 100644 (file)
@@ -17,6 +17,7 @@
 #include <Elementary.h>
 #include <app_debug.h>
 #include <gridmgr.h>
+#include <inputmgr.h>
 
 #include "define.h"
 #include "data/mediadata.h"
@@ -31,6 +32,68 @@ struct listmgr {
        struct listmgr_data *data;
 };
 
+void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj,
+                       Evas_Event_Mouse_Move *ev)
+{
+       Elm_Object_Item *it;
+
+       if (!obj || !ev)
+               return;
+
+       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))
+               return;
+
+       elm_object_item_focus_set(it, EINA_TRUE);
+}
+
+void _grid_selected_cb(void *data, Elm_Object_Item *it,
+                       const char *emission, const char *source)
+{
+       struct listmgr *lmgr;
+       struct listmgr_data *ldata;
+
+       if (!data || !it)
+               return;
+
+       lmgr = data;
+       ldata = lmgr->data;
+
+       if (ldata->grid_selected_cb)
+               ldata->grid_selected_cb(ldata->cb_data, it);
+}
+
+void _grid_realized_cb(int id, void *data, Evas_Object *obj,
+                       Elm_Object_Item *it)
+{
+       if (!data || !it)
+               return;
+
+       elm_object_item_signal_callback_add(it, SIG_ITEM_SELECTED,
+                               SIG_SOURCE_EDC, _grid_selected_cb, data);
+}
+
+void _grid_unrealized_cb(int id, void *data, Evas_Object *obj,
+                       Elm_Object_Item *it)
+{
+       if (!it)
+               return;
+
+       elm_object_item_signal_callback_del(it, SIG_ITEM_SELECTED,
+                               SIG_SOURCE_EDC, _grid_selected_cb);
+}
+
+static input_handler grid_handler = {
+       .mouse_move = _mouse_move_cb,
+       .realized = _grid_realized_cb,
+       .unrealized = _grid_unrealized_cb
+};
+
 static int _get_grid_size(int count, int num_item)
 {
        int size;
@@ -86,6 +149,8 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi)
        evas_object_size_hint_min_set(grid, size * data->grid_item_x,
                                data->grid_num_item * data->grid_item_y);
 
+       inputmgr_add_callback(grid, 0, &grid_handler, lmgr);
+
        elm_object_part_content_set(ly, PART_ITEM_TITLE, btn);
        elm_object_part_content_set(ly, PART_ITEM_CONTENT, grid);
 
index 20ac818..ce88147 100644 (file)
@@ -124,3 +124,20 @@ void util_up_string(char *str)
                str++;
        }
 }
+
+int util_get_media_index(Eina_List *list, void *data)
+{
+       Eina_List *l;
+       int index;
+       void *obj;
+
+       index = 0;
+       EINA_LIST_FOREACH(list, l, obj) {
+               if (data == obj)
+                       break;
+
+               index++;
+       }
+
+       return index;
+}