gengrid: fix focus issue when prev/next item is disabled 04/89904/2
authorSangHyeon Lee <sh10233.lee@samsung.com>
Tue, 27 Sep 2016 10:33:02 +0000 (19:33 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Thu, 17 Nov 2016 08:07:49 +0000 (17:07 +0900)
This patch is forked by upstream patch
effe9b169658ec10f2edca087e4cfd4d8cea8dcf
written by Jehun Lim

Change-Id: I135bbb52503d7fd7f7ee6187182e300a189003d4
Signed-off-by: SangHyeon Lee <sh10233.lee@samsung.com>
src/bin/test.c
src/bin/test_gengrid.c
src/lib/elm_gengrid.c

index 66fc9a0bfd3d6f94a25485ad2ec8e0174e4d6b2e..62fe4dabb7482a1728de7252fcf160a970929aac 100644 (file)
@@ -147,6 +147,7 @@ void test_gengrid_item_styles(void *data, Evas_Object *obj, void *event_info);
 void test_gengrid_speed(void *data, Evas_Object *obj, void *event_info);
 void test_gengrid_focus(void *data, Evas_Object *obj, void *event_info);
 void test_gengrid_update(void *data, Evas_Object *obj, void *event_info);
+void test_gengrid_disabled_item_focus(void *data, Evas_Object *obj, void *event_info);
 void test_win_state(void *data, Evas_Object *obj, void *event_info);
 void test_win_state2(void *data, Evas_Object *obj, void *event_info);
 void test_progressbar(void *data, Evas_Object *obj, void *event_info);
index 523aaf330118f43f0e4d11182f7c45540e9316bb..346e1f996cb0dcd5d0309a0212a94bcf6f96c59b 100644 (file)
@@ -2248,3 +2248,75 @@ test_gengrid_update(void *data EINA_UNUSED,
    evas_object_resize(win, 600, 600);
    evas_object_show(win);
 }
+
+void
+test_gengrid_disabled_item_focus(void *data EINA_UNUSED,
+                                 Evas_Object *obj EINA_UNUSED,
+                                 void *event_info EINA_UNUSED)
+{
+   Evas_Object *win, *bx, *obx, *grid, *ck;
+   Elm_Gengrid_Item_Class *ic;
+   Item_Data *id;
+   int i, n;
+   char buf[PATH_MAX];
+
+   win = elm_win_util_standard_add("gengrid_disabled_focus", "Gengrid Disabled Focus");
+   elm_win_autodel_set(win, EINA_TRUE);
+
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bx);
+   evas_object_show(bx);
+
+   grid = elm_gengrid_add(win);
+
+   elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150));
+   elm_gengrid_multi_select_set(grid, EINA_FALSE);
+   evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_min_set(grid, 600, 550);
+   elm_box_pack_end(bx, grid);
+   evas_object_show(grid);
+   evas_object_smart_callback_add(grid, "item,focused", _gengrid_focus_item_cb, "item,focused");
+   evas_object_smart_callback_add(grid, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused");
+   evas_object_smart_callback_add(grid, "selected", grid_selected, NULL);
+
+   obx = elm_box_add(win);
+   evas_object_size_hint_weight_set(obx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_box_horizontal_set(obx, EINA_TRUE);
+   elm_box_pack_end(bx, obx);
+   evas_object_show(obx);
+
+   ck = elm_check_add(win);
+   elm_object_text_set(ck, "Item select on focus disable");
+   elm_check_state_set(ck, elm_config_item_select_on_focus_disabled_get());
+   evas_object_smart_callback_add(ck, "changed",
+                                  _gg_focus_item_select_on_focus_disable_changed_cb,
+                                  NULL);
+   elm_box_pack_end(obx, ck);
+   evas_object_show(ck);
+
+   ic = elm_gengrid_item_class_new();
+   ic->item_style = "default";
+   ic->func.text_get = grid_text_get;
+   ic->func.content_get = grid_content_get;
+   ic->func.state_get = NULL;
+   ic->func.del = grid_del;
+
+   n = 0;
+   for (i = 0; i < 23; i++)
+     {
+        id = calloc(1, sizeof(Item_Data));
+        snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]);
+        n = (n + 1) % 9;
+        id->mode = i;
+        id->path = eina_stringshare_add(buf);
+        id->item = elm_gengrid_item_append(grid, ic, id, NULL, NULL);
+        if (i == 4 || i == 8 || i == 11 || i == 22)
+          elm_object_item_disabled_set(id->item, EINA_TRUE);
+     }
+
+   elm_gengrid_item_class_free(ic);
+
+   evas_object_resize(win, 600, 600);
+   evas_object_show(win);
+}
index 8d3ea113b8abbbd59b3a33d5466a4dedba5c0c8d..cfdf0367258ef851f9401ed355b9b929ab4f6655 100644 (file)
@@ -2184,27 +2184,31 @@ _item_focus_up(Elm_Gengrid_Data *sd)
    if (!sd->focused_item)
      {
         prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
-        while ((prev) && (prev->generation < sd->generation))
+        while (((prev) && (prev->generation < sd->generation))
+               || elm_object_item_disabled_get(EO_OBJ(prev)))
           prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
-        elm_object_item_focus_set(EO_OBJ(prev), EINA_TRUE);
-        return EINA_TRUE;
      }
    else
      {
         Elm_Object_Item *eo_prev = elm_gengrid_item_prev_get(sd->focused_item);
         if (!eo_prev) return EINA_FALSE;
-        prev = eo_data_scope_get(eo_prev, ELM_GENGRID_ITEM_CLASS);
         if (eo_prev == sd->focused_item) return EINA_FALSE;
-     }
+          eo_prev = sd->focused_item;
+        while (eo_prev)
+          {
+             for (i = 0; i < sd->nmax; i++)
+               {
+                  eo_prev = elm_gengrid_item_prev_get(eo_prev);
+                  if (!eo_prev) return EINA_FALSE;
+               }
+             if (!elm_object_item_disabled_get(eo_prev)) break;
+          }
 
-   for (i = 1; i < sd->nmax; i++)
-     {
-        Elm_Object_Item *eo_tmp =
-          elm_gengrid_item_prev_get(EO_OBJ(prev));
-        if (!eo_tmp) return EINA_FALSE;
-        prev = eo_data_scope_get(eo_tmp, ELM_GENGRID_ITEM_CLASS);
+        prev = eo_data_scope_get(eo_prev, ELM_GENGRID_ITEM_CLASS);
      }
 
+   if (!prev) return EINA_FALSE;
+
    elm_object_item_focus_set(EO_OBJ(prev), EINA_TRUE);
 
    return EINA_TRUE;
@@ -2215,12 +2219,13 @@ _item_focus_down(Elm_Gengrid_Data *sd)
 {
    unsigned int i, idx;
    Elm_Gen_Item *next = NULL;
-   Elm_Object_Item *eo_tmp = NULL;
+   Elm_Object_Item *eo_next = NULL;
 
    if (!sd->focused_item)
      {
         next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
-        while ((next) && (next->generation < sd->generation))
+        while (((next) && (next->generation < sd->generation))
+               || elm_object_item_disabled_get(EO_OBJ(next)))
           next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
      }
    else
@@ -2234,21 +2239,28 @@ _item_focus_down(Elm_Gengrid_Data *sd)
           return EINA_FALSE;
         if (idx > sd->item_count - sd->nmax)
           {
-             eo_tmp = elm_gengrid_last_item_get(sd->obj);
-             next = eo_data_scope_get(eo_tmp, ELM_GENGRID_ITEM_CLASS);
+             eo_next = elm_gengrid_last_item_get(sd->obj);
+             if (elm_object_item_disabled_get(eo_next)) return EINA_FALSE;
           }
         else
           {
-             next = eo_data_scope_get(sd->focused_item, ELM_GENGRID_ITEM_CLASS);
-             for (i = 0; i < sd->nmax; i++)
+             eo_next = sd->focused_item;
+             while (eo_next)
                {
-                  eo_tmp = elm_gengrid_item_next_get(EO_OBJ(next));
-                  if (!eo_tmp) return EINA_FALSE;
-                  next = eo_data_scope_get(eo_tmp, ELM_GENGRID_ITEM_CLASS);
+                  for (i = 0; i < sd->nmax; i++)
+                    {
+                       eo_next = elm_gengrid_item_next_get(eo_next);
+                       if (!eo_next) return EINA_FALSE;
+                    }
+                  if (!elm_object_item_disabled_get(eo_next)) break;
                }
           }
+
+        next = eo_data_scope_get(eo_next, ELM_GENGRID_ITEM_CLASS);
      }
 
+   if (!next) return EINA_FALSE;
+
    elm_object_item_focus_set(EO_OBJ(next), EINA_TRUE);
 
    return EINA_TRUE;
@@ -2262,17 +2274,27 @@ _item_focus_left(Elm_Gengrid_Data *sd)
    if (!sd->focused_item)
      {
         prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
-        while ((prev) && (prev->generation < sd->generation))
+        while (((prev) && (prev->generation < sd->generation))
+               || elm_object_item_disabled_get(EO_OBJ(prev)))
           prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev);
      }
    else
      {
         Elm_Object_Item *eo_prev = elm_gengrid_item_prev_get(sd->focused_item);
         if (!eo_prev) return EINA_FALSE;
-        prev = eo_data_scope_get(eo_prev, ELM_GENGRID_ITEM_CLASS);
         if (eo_prev == sd->focused_item) return EINA_FALSE;
+
+        while (eo_prev)
+          {
+             if (!elm_object_item_disabled_get(eo_prev)) break;
+             eo_prev = elm_gengrid_item_prev_get(eo_prev);
+          }
+
+        prev = eo_data_scope_get(eo_prev, ELM_GENGRID_ITEM_CLASS);
      }
 
+   if (!prev) return EINA_FALSE;
+
    elm_object_item_focus_set(EO_OBJ(prev), EINA_TRUE);
 
    return EINA_TRUE;
@@ -2286,17 +2308,27 @@ _item_focus_right(Elm_Gengrid_Data *sd)
    if (!sd->focused_item)
      {
         next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
-        while ((next) && (next->generation < sd->generation))
+        while (((next) && (next->generation < sd->generation))
+               || elm_object_item_disabled_get(EO_OBJ(next)))
           next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
      }
    else
      {
         Elm_Object_Item *eo_next = elm_gengrid_item_next_get(sd->focused_item);
         if (!eo_next) return EINA_FALSE;
-        next = eo_data_scope_get(eo_next, ELM_GENGRID_ITEM_CLASS);
         if (eo_next == sd->focused_item) return EINA_FALSE;
+
+        while (eo_next)
+          {
+            if (!elm_object_item_disabled_get(eo_next)) break;
+             eo_next = elm_gengrid_item_next_get(eo_next);
+          }
+
+        next = eo_data_scope_get(eo_next, ELM_GENGRID_ITEM_CLASS);
      }
 
+   if (!next) return EINA_FALSE;
+
    elm_object_item_focus_set(EO_OBJ(next), EINA_TRUE);
 
    return EINA_TRUE;