jaehwan pushed a commit to branch master.

commit acb3cd6daf829001fbc2db6733b0a45e4a7ef9cc
Author: Jaehwan Kim <[email protected]>
Date:   Mon Apr 15 14:34:15 2013 +0900

    [Toolbar] Add the feature for key events.
---
 ChangeLog                             |   4 ++
 NEWS                                  |   1 +
 data/themes/images/item_highlight.png | Bin 0 -> 266 bytes
 data/themes/widgets/toolbar.edc       |  81 +++++++++++++++++++++
 src/lib/elm_toolbar.c                 | 128 +++++++++++++++++++++++++++++++++-
 src/lib/elm_widget_toolbar.h          |   3 +-
 6 files changed, 214 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d10a4dc..a146147 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1247,3 +1247,7 @@
 
         * Fix the calculation double type number.
         Round off to the nearest whole number.
+
+2013-04-15  Jaehwan Kim
+
+        * Add the feature for key events.
diff --git a/NEWS b/NEWS
index 2352b5a..cc4b0b0 100644
--- a/NEWS
+++ b/NEWS
@@ -60,6 +60,7 @@ Additions:
    * Add the API elm_scroller_page_scroll_limit_set/get.
    * Add elm_mapbuf_auto_set/get.
    * Add the API elm_scroller_single_direction_set/get.
+   * Add the feature for key events.
 
 Improvements:
 
diff --git a/data/themes/images/item_highlight.png 
b/data/themes/images/item_highlight.png
new file mode 100644
index 0000000..d3852da
Binary files /dev/null and b/data/themes/images/item_highlight.png differ
diff --git a/data/themes/widgets/toolbar.edc b/data/themes/widgets/toolbar.edc
index a043042..3b612e4 100644
--- a/data/themes/widgets/toolbar.edc
+++ b/data/themes/widgets/toolbar.edc
@@ -390,6 +390,7 @@ group { name: "elm/toolbar/more/default";
 group { name: "elm/toolbar/item/default";
    images {
       image: "toolbar_sel.png" COMP;
+      image: "item_highlight.png" COMP;
    }
    data.item: "transition_animation_on" "1";
    parts {
@@ -665,6 +666,20 @@ group { name: "elm/toolbar/item/default";
             color: 255 255 255 255;
          }
       }
+      part { name: "highlight";
+         type: IMAGE;
+         description { state: "default" 0.0;
+            visible: 0;
+            image {
+                normal: "item_highlight.png";
+                border: 3 3 3 3;
+            }
+         }
+         description { state: "highlighted" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
       part { name: "event";
          type: RECT;
          mouse_events: 1;
@@ -828,6 +843,18 @@ group { name: "elm/toolbar/item/default";
          target: "elm.icon.clipper";
          target: "elm.icon_new.clipper";
       }
+      program { name: "highlight_on";
+         signal: "elm,highlight,on";
+         source: "elm";
+         action: STATE_SET "highlighted" 0.0;
+         target: "highlight";
+      }
+      program { name: "highlight_off";
+         signal: "elm,highlight,off";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "highlight";
+      }
    }
 }
 
@@ -1397,6 +1424,20 @@ group { name: "elm/toolbar/item/item_centered";
             color: 255 255 255 153;
          }
       }
+      part { name: "highlight";
+         type: IMAGE;
+         description { state: "default" 0.0;
+            visible: 0;
+            image {
+                normal: "item_highlight.png";
+                border: 3 3 3 3;
+            }
+         }
+         description { state: "highlighted" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
       part { name: "event";
          type: RECT;
          mouse_events: 1;
@@ -1611,6 +1652,18 @@ group { name: "elm/toolbar/item/item_centered";
               set_state(PART:"padding_after_icon", "default", 0.0);
          }
       }
+      program { name: "highlight_on";
+         signal: "elm,highlight,on";
+         source: "elm";
+         action: STATE_SET "highlighted" 0.0;
+         target: "highlight";
+      }
+      program { name: "highlight_off";
+         signal: "elm,highlight,off";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "highlight";
+      }
    }
 }
 
@@ -1643,5 +1696,33 @@ group { name: "elm/toolbar/object/default";
          description { state: "default" 0.0;
          }
       }
+      part { name: "highlight";
+         type: IMAGE;
+         description { state: "default" 0.0;
+            visible: 0;
+            image {
+                normal: "item_highlight.png";
+                border: 3 3 3 3;
+            }
+         }
+         description { state: "highlighted" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+   }
+   programs {
+      program { name: "highlight_on";
+         signal: "elm,highlight,on";
+         source: "elm";
+         action: STATE_SET "highlighted" 0.0;
+         target: "highlight";
+      }
+      program { name: "highlight_off";
+         signal: "elm,highlight,off";
+         source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "highlight";
+      }
    }
 }
diff --git a/src/lib/elm_toolbar.c b/src/lib/elm_toolbar.c
index 1bac876..da7033e 100644
--- a/src/lib/elm_toolbar.c
+++ b/src/lib/elm_toolbar.c
@@ -23,6 +23,8 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {NULL, NULL}
 };
 
+static void _item_select(Elm_Toolbar_Item *it);
+
 static int
 _toolbar_item_prio_compare_cb(const void *i1,
                               const void *i2)
@@ -563,15 +565,63 @@ _elm_toolbar_smart_on_focus(Eo *obj, void *_pd 
EINA_UNUSED, va_list *list)
 {
    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
    Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_TOOLBAR_DATA_GET(obj, sd);
 
    if (elm_widget_focus_get(obj))
      evas_object_focus_set(wd->resize_obj, EINA_TRUE);
    else
-     evas_object_focus_set(wd->resize_obj, EINA_FALSE);
+     {
+        if (sd->highlighted_item)
+          {
+             edje_object_signal_emit(VIEW(sd->highlighted_item), 
"elm,highlight,off", "elm");
+             sd->highlighted_item = NULL;
+          }
+        evas_object_focus_set(wd->resize_obj, EINA_FALSE);
+     }
 
    if (ret) *ret = EINA_TRUE;
 }
 
+static Elm_Toolbar_Item *
+_highlight_next_item_get(Evas_Object *obj, Evas_Object *box, Eina_Bool reverse)
+{
+   ELM_TOOLBAR_DATA_GET(obj, sd);
+   Eina_List *list = NULL;
+   Elm_Toolbar_Item *it = NULL;
+   Evas_Object *it_obj = NULL;
+
+   list = evas_object_box_children_get(box);
+   if (reverse)
+     list = eina_list_reverse(list);
+
+   if (sd->highlighted_item)
+     {
+        list = eina_list_data_find_list(list, VIEW(sd->highlighted_item));
+        if (list) list = eina_list_next(list);
+     }
+   it_obj = eina_list_data_get(list);
+   if (it_obj) it = evas_object_data_get(it_obj, "item");
+   else it = NULL;
+
+   while (it &&
+          (it->separator ||
+           elm_object_item_disabled_get((Elm_Object_Item *)it)))
+     {
+        if (list) list = eina_list_next(list);
+        if (!list)
+          {
+             it = NULL;
+             break;
+          }
+        it_obj = eina_list_data_get(list);
+        if (it_obj) it = evas_object_data_get(it_obj, "item");
+        else it = NULL;
+     }
+
+   return it;
+}
+
+
 static void
 _elm_toolbar_smart_event(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list 
*list)
 {
@@ -582,12 +632,85 @@ _elm_toolbar_smart_event(Eo *obj EINA_UNUSED, void *_pd 
EINA_UNUSED, va_list *li
    void *event_info = va_arg(*list, void *);
    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
    if (ret) *ret = EINA_FALSE;
+   Elm_Toolbar_Item *it = NULL;
+
+   ELM_TOOLBAR_DATA_GET(obj, sd);
 
    Evas_Event_Key_Down *ev = event_info;
 
+   if (elm_widget_disabled_get(obj)) return;
+   if (type != EVAS_CALLBACK_KEY_DOWN) return;
+   if (!sd->items) return;
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
 
-   //TODO: Key Down Event precess for toolbar
+   if ((!strcmp(ev->keyname, "Return")) ||
+            ((!strcmp(ev->keyname, "KP_Enter")) && !ev->string))
+     {
+        if (sd->highlighted_item)
+          _item_select(sd->highlighted_item);
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+        if (ret) *ret = EINA_TRUE;
+        return;
+     }
+   else if ((!strcmp(ev->keyname, "Left")) ||
+            ((!strcmp(ev->keyname, "KP_Left")) && !ev->string))
+     {
+        if (!sd->vertical)
+          it = _highlight_next_item_get(obj, sd->bx, EINA_TRUE);
+        else
+          {
+             if (ret) *ret = EINA_FALSE;
+             return;
+          }
+     }
+   else if ((!strcmp(ev->keyname, "Right")) ||
+            ((!strcmp(ev->keyname, "KP_Right")) && !ev->string))
+     {
+        if (!sd->vertical)
+          it = _highlight_next_item_get(obj, sd->bx, EINA_FALSE);
+        else
+          {
+             if (ret) *ret = EINA_FALSE;
+             return;
+          }
+     }
+   else if ((!strcmp(ev->keyname, "Up")) ||
+            ((!strcmp(ev->keyname, "KP_Up")) && !ev->string))
+     {
+        if (sd->vertical)
+          it = _highlight_next_item_get(obj, sd->bx, EINA_TRUE);
+        else
+          {
+             if (ret) *ret = EINA_FALSE;
+             return;
+          }
+     }
+   else if ((!strcmp(ev->keyname, "Down")) ||
+            ((!strcmp(ev->keyname, "KP_Down")) && !ev->string))
+     {
+        if (sd->vertical)
+          it = _highlight_next_item_get(obj, sd->bx, EINA_FALSE);
+        else
+          {
+             if (ret) *ret = EINA_FALSE;
+             return;
+          }
+     }
+
+   if (!it)
+     {
+        if (ret) *ret = EINA_FALSE;
+        return;
+     }
+
+   if (sd->highlighted_item)
+     edje_object_signal_emit(VIEW(sd->highlighted_item), "elm,highlight,off", 
"elm");
+   sd->highlighted_item = it;
+   edje_object_signal_emit(VIEW(sd->highlighted_item), "elm,highlight,on", 
"elm");
+
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+   if (ret) *ret = EINA_TRUE;
+   return;
 }
 
 static void
@@ -1914,6 +2037,7 @@ _item_new(Evas_Object *obj,
    it->base.data = data;
 
    VIEW(it) = edje_object_add(evas_object_evas_get(obj));
+   evas_object_data_set(VIEW(it), "item", it);
 
    if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
      _access_widget_item_register(it);
diff --git a/src/lib/elm_widget_toolbar.h b/src/lib/elm_widget_toolbar.h
index 4b9142f..f445d55 100644
--- a/src/lib/elm_widget_toolbar.h
+++ b/src/lib/elm_widget_toolbar.h
@@ -28,7 +28,8 @@ struct _Elm_Toolbar_Smart_Data
    Evas_Object                          *bx, *more, *bx_more, *bx_more2;
    Evas_Object                          *menu_parent;
    Eina_Inlist                          *items;
-   Elm_Toolbar_Item                     *more_item, *selected_item;
+   Elm_Toolbar_Item                     *more_item;
+   Elm_Toolbar_Item                     *selected_item, *highlighted_item;
    Elm_Toolbar_Item                     *reorder_empty, *reorder_item;
    Elm_Toolbar_Shrink_Mode               shrink_mode;
    Elm_Icon_Lookup_Order                 lookup_order;

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to