diff --git a/legacy/elementary/ChangeLog b/legacy/elementary/ChangeLog index d10a4dcbbb..a14614753f 100644 --- a/legacy/elementary/ChangeLog +++ b/legacy/elementary/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/legacy/elementary/NEWS b/legacy/elementary/NEWS index 2352b5ab36..cc4b0b0260 100644 --- a/legacy/elementary/NEWS +++ b/legacy/elementary/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/legacy/elementary/data/themes/images/item_highlight.png b/legacy/elementary/data/themes/images/item_highlight.png new file mode 100644 index 0000000000..d3852daeeb Binary files /dev/null and b/legacy/elementary/data/themes/images/item_highlight.png differ diff --git a/legacy/elementary/data/themes/widgets/toolbar.edc b/legacy/elementary/data/themes/widgets/toolbar.edc index a0430421fe..3b612e4817 100644 --- a/legacy/elementary/data/themes/widgets/toolbar.edc +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_toolbar.c b/legacy/elementary/src/lib/elm_toolbar.c index 1bac876121..da7033e495 100644 --- a/legacy/elementary/src/lib/elm_toolbar.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_widget_toolbar.h b/legacy/elementary/src/lib/elm_widget_toolbar.h index 4b9142f4d2..f445d553c4 100644 --- a/legacy/elementary/src/lib/elm_widget_toolbar.h +++ b/legacy/elementary/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;