Move focus to previously focused grid item when UP key pressed on sort button 02/45202/2
authorHyojung Jo <hj903.jo@samsung.com>
Mon, 3 Aug 2015 12:11:02 +0000 (21:11 +0900)
committerHyojung Jo <hj903.jo@samsung.com>
Tue, 4 Aug 2015 04:47:17 +0000 (13:47 +0900)
Change-Id: I130559fb995f37edcf2331dfc9e2c7cbdb659689
Signed-off-by: Hyojung Jo <hj903.jo@samsung.com>
res/widget/gengrid.edc
src/view/view_base.c

index fab4f47..f4a5202 100644 (file)
@@ -580,6 +580,7 @@ group {
                        target, "part.focus.down";
                        target, "part.focus.right";
                        transition, TRANSITION_FOCUS;
+                       after, "item_focused";
                }
 
                program {
index 2ab263c..3f42b07 100644 (file)
@@ -61,7 +61,7 @@ struct _priv {
        Evas_Object *sort_btn;
        Evas_Object *sort_popup;
        Evas_Object *grid;
-       Elm_Object_Item *cur_selected_item;
+       Elm_Object_Item *focused_item;
        struct gridmgr *gmgr;
        Eina_List *app_list;
        enum sort_type sort_type;
@@ -267,11 +267,13 @@ static void _sort_option_selected(struct _priv *priv, int id, Evas_Object *obj)
                return;
        }
 
+       if (!priv->app_list)
+               return;
+
        switch (id) {
        case SORT_RECENT:
                _sort_by_recently_used(priv);
                priv->sort_type = SORT_RECENT;
-
                break;
 
        case SORT_A_TO_Z:
@@ -293,6 +295,7 @@ static void _sort_option_selected(struct _priv *priv, int id, Evas_Object *obj)
        _destroy_sort_ctxpopup(priv);
        elm_object_text_set(priv->sort_btn, elm_object_text_get(obj));
        gridmgr_append_list(priv->gmgr, STR_MYAPPS, priv->app_list);
+       priv->focused_item = elm_gengrid_first_item_get(priv->grid);
 }
 
 static void _option_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
@@ -409,12 +412,33 @@ static void _sort_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
        priv = data;
 
        if (!strcmp(ev->keyname, KEY_BACK)
-                       || !strcmp(ev->keyname, KEY_BACK_REMOTE))
+                       || !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
                ui_app_exit();
-       else if (!strcmp(ev->keyname, KEY_ENTER)
-                       || !strcmp(ev->keyname, KEY_ENTER_REMOTE))
+       else if (!strcmp(ev->keyname, KEY_ENTER)
+                       || !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
                if (!_draw_sort_option(priv))
                        _ERR("Draw sort ctxpopup failed.");
+       }
+}
+
+static void _sort_key_up_cb(int id, void *data, Evas *e, Evas_Object *obj,
+               Evas_Event_Key_Up *ev)
+{
+       struct _priv *priv;
+
+       if (!data || !obj || !ev) {
+               _ERR("Invalid argument.");
+               return;
+       }
+       priv = data;
+
+       if (!strcmp(ev->keyname, KEY_UP)) {
+               if (priv->focused_item)
+                       elm_object_item_focus_set(priv->focused_item,
+                                       EINA_TRUE);
+               else
+                       elm_object_focus_set(priv->focused_menu, EINA_TRUE);
+       }
 }
 
 static void _sort_mouse_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
@@ -464,10 +488,22 @@ static void _grid_focused_cb(int id, void *data, Evas_Object *obj,
 
        elm_object_signal_emit(priv->focused_menu, SIG_SELECTED, SRC_MENU_BTN);
 
-       if (priv->cur_selected_item) {
-               elm_object_item_focus_set(priv->cur_selected_item, EINA_TRUE);
-               priv->cur_selected_item = NULL;
+       if (priv->focused_item)
+               elm_object_item_focus_set(priv->focused_item, EINA_TRUE);
+}
+
+static void _grid_item_focused_cb(void *data, Elm_Object_Item *it,
+               const char *emission, const char *source)
+{
+       struct _priv *priv;
+
+       if (!data || !it) {
+               _ERR("Invalid argument.");
+               return;
        }
+       priv = data;
+
+       priv->focused_item = it;
 }
 
 static void _grid_item_selected_cb(void *data, Elm_Object_Item *it,
@@ -498,12 +534,12 @@ static void _grid_item_selected_cb(void *data, Elm_Object_Item *it,
                gridmgr_append_list(priv->gmgr, STR_MYAPPS, priv->app_list);
 
                item = elm_gengrid_first_item_get(priv->grid);
-               priv->cur_selected_item = NULL;
+               priv->focused_item = NULL;
 
                while (item) {
                        new_adata = elm_object_item_data_get(item);
                        if (adata == new_adata) {
-                               priv->cur_selected_item = item;
+                               priv->focused_item = item;
                                break;
                        }
 
@@ -524,6 +560,8 @@ static void _grid_realized_cb(int id, void *data, Evas_Object *obj,
 
        adata = elm_object_item_data_get(item);
 
+       elm_object_item_signal_callback_add(item, SIG_ITEM_FOCUSED,
+                       SIG_SOURCE_EDC, _grid_item_focused_cb, data);
        elm_object_item_signal_callback_add(item, SIG_ITEM_SELECTED,
                        SIG_SOURCE_EDC, _grid_item_selected_cb, data);
 
@@ -540,6 +578,8 @@ static void _grid_unrealized_cb(int id, void *data, Evas_Object *obj,
                return;
        }
 
+       elm_object_item_signal_callback_del(item, SIG_ITEM_FOCUSED,
+                       SIG_SOURCE_EDC, _grid_item_focused_cb);
        elm_object_item_signal_callback_del(item, SIG_ITEM_SELECTED,
                        SIG_SOURCE_EDC, _grid_item_selected_cb);
 }
@@ -570,6 +610,7 @@ static input_handler _menu_input_handler = {
 static input_handler _sort_input_handler = {
        .mouse_move = _mouse_move_cb,
        .key_down = _sort_key_down_cb,
+       .key_up = _sort_key_up_cb,
        .mouse_down = _sort_mouse_down_cb
 };
 
@@ -650,7 +691,7 @@ static bool _draw_bottom_area(struct _priv *priv)
        elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN);
        elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT);
        elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT);
-       elm_object_focus_next_object_set(btn, priv->grid, ELM_FOCUS_UP);
+       elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP);
        elm_object_focus_next_object_set(priv->grid, btn, ELM_FOCUS_DOWN);
 
        priv->sort_btn = btn;
@@ -685,7 +726,7 @@ static bool _draw_myapps_grid(struct _priv *priv)
 
        elm_object_part_content_set(priv->base, PART_GENGRID, priv->grid);
 
-       priv->cur_selected_item = NULL;
+       priv->focused_item = NULL;
 
        return true;
 }