Colorselector - selection in palette with up and down arrows is now possible
authorYossi Kantor <yossi.kantor@samsung.com>
Wed, 27 Mar 2013 13:25:46 +0000 (15:25 +0200)
committerDaniel Zaoui <daniel.zaoui@samsung.com>
Mon, 22 Apr 2013 08:51:46 +0000 (11:51 +0300)
legacy/elementary/src/lib/elm_colorselector.c

index 2acc5c2..76b2837 100644 (file)
@@ -27,6 +27,12 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] =
    {NULL, NULL}
 };
 
+enum Palette_Box_Direction
+{
+   PALETTE_BOX_UP,
+   PALETTE_BOX_DOWN
+};
+
 static void
 _items_del(Elm_Colorselector_Smart_Data *sd)
 {
@@ -1566,6 +1572,63 @@ _elm_colorselector_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
      free(tmp[i]);
 }
 
+static Eina_List*
+_palette_box_vertical_item_get(Eina_List* ref_item, enum Palette_Box_Direction dir)
+{
+   Evas_Coord basex, basey, x, y, dx, min_dx;
+   Elm_Color_Item *item;
+   Eina_List* l;
+   Eina_List* res = NULL;
+   Eina_List* (*dir_func)(const Eina_List*);
+
+   if (!ref_item) return NULL;
+
+   switch(dir)
+     {
+        case PALETTE_BOX_UP:
+          dir_func = eina_list_prev;
+          break;
+        case PALETTE_BOX_DOWN:
+          dir_func = eina_list_next;
+          break;
+        default:
+          return NULL;
+     }
+
+   item = eina_list_data_get(ref_item);
+   evas_object_geometry_get(VIEW(item), &basex, &basey, NULL, NULL);
+
+   for (l = ref_item; l; l = dir_func(l))
+     {
+        item = eina_list_data_get(l);
+        evas_object_geometry_get(VIEW(item), &x, &y, NULL, NULL);
+        if (basey != y) break;
+     }
+
+   basey = y;
+   min_dx = -1;
+
+   for (; l; l = dir_func(l))
+     {
+        item = eina_list_data_get(l);
+        evas_object_geometry_get(VIEW(item), &x, &y, NULL, NULL);
+        if (basey != y) break;
+
+        dx = abs(x - basex);
+        if (dx < min_dx || min_dx < 0)
+          {
+             min_dx = dx;
+             res = l;
+          }
+        else
+          {
+             break;
+          }
+      }
+
+   return res;
+}
+
 static void
 _elm_colorselector_smart_event(Eo *obj, void *_pd, va_list *list)
 {
@@ -1631,21 +1694,24 @@ _elm_colorselector_smart_event(Eo *obj, void *_pd, va_list *list)
                }
           }
         else if (sd->focused == ELM_COLORSELECTOR_PALETTE)
-          return;
+        {
+            cl = _palette_box_vertical_item_get(sd->selected, PALETTE_BOX_UP);
+            if (!cl) cl = sd->selected;
+        }
      }
    else if ((!strcmp(ev->keyname, "Down")) ||
             ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
      {
         if (sd->focused == ELM_COLORSELECTOR_PALETTE)
           {
-             if (sd->mode == ELM_COLORSELECTOR_BOTH)
+             cl = _palette_box_vertical_item_get(sd->selected, PALETTE_BOX_DOWN);
+             if (sd->mode == ELM_COLORSELECTOR_BOTH && !cl)
                {
                   sd->focused = ELM_COLORSELECTOR_COMPONENTS;
                   /*when focus is shifted to component start from
                    * first color type*/
                   sd->sel_color_type = HUE;
                }
-             else return;
           }
         else if (sd->focused == ELM_COLORSELECTOR_COMPONENTS)
           {