From 8be6af8e192a42df46cd808130e7c33aa01bca94 Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Tue, 14 May 2013 17:27:52 +0900 Subject: [PATCH] [datetime][access] enable access feature on datetime with label,diskselector Change-Id: I7ebf5baba1fe7dc8bd1c9e479d8fe0176adbbff3 --- src/lib/elm_diskselector.c | 36 +++++++++------ src/lib/elm_label.c | 19 ++++++++ .../datetime_input_ctxpopup.c | 52 +++++++++++++++++++++- 3 files changed, 91 insertions(+), 16 deletions(-) diff --git a/src/lib/elm_diskselector.c b/src/lib/elm_diskselector.c index a31089c..fcb929d 100644 --- a/src/lib/elm_diskselector.c +++ b/src/lib/elm_diskselector.c @@ -584,6 +584,14 @@ _access_on_highlight_cb(void *data) sd->s_iface->region_bring_in(WIDGET(it), x, y, w, h); } +static void +_access_activate_cb(void *data __UNUSED__, + Evas_Object *part_obj __UNUSED__, + Elm_Object_Item *item) +{ + _item_click_cb(item, NULL, NULL, NULL); +} + static Elm_Diskselector_Item * _item_new(Evas_Object *obj, Evas_Object *icon, @@ -591,6 +599,7 @@ _item_new(Evas_Object *obj, Evas_Smart_Cb func, const void *data) { + Elm_Access_Info *ai; Elm_Diskselector_Item *it; const char *style = elm_widget_style_get(obj); @@ -624,19 +633,16 @@ _item_new(Evas_Object *obj, (VIEW(it), "elm,action,click", "", _item_click_cb, it); } - //XXX: ACCESS - if (_elm_config->access_mode == ELM_ACCESS_MODE_ON) + /* access */ + if (_elm_config->access_mode) { _elm_access_widget_item_register((Elm_Widget_Item *)it); + ai = _elm_access_object_get(it->base.access_obj); - _elm_access_text_set(_elm_access_object_get(it->base.access_obj), - ELM_ACCESS_TYPE, E_("diskselector item")); - _elm_access_callback_set(_elm_access_object_get(it->base.access_obj), - ELM_ACCESS_INFO, - _access_info_cb, it); - _elm_access_on_highlight_hook_set( - _elm_access_object_get(it->base.access_obj), _access_on_highlight_cb, - it); + _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("diskselector item")); + _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it); + _elm_access_on_highlight_hook_set(ai, _access_on_highlight_cb, it); + _elm_access_activate_callback_set(ai, _access_activate_cb, it); } return it; @@ -1390,7 +1396,7 @@ _elm_diskselector_smart_member_add(Evas_Object *obj, } static void -_access_hook(Evas_Object *obj, Eina_Bool is_access) +_elm_diskselector_smart_access(Evas_Object *obj, Eina_Bool is_access) { ELM_DISKSELECTOR_DATA_GET(obj, sd); @@ -1398,6 +1404,8 @@ _access_hook(Evas_Object *obj, Eina_Bool is_access) ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = _elm_diskselector_smart_focus_next; else ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = NULL; + + //TODO: register, unregister item } @@ -1416,11 +1424,11 @@ _elm_diskselector_smart_set_user(Elm_Diskselector_Smart_Class *sc) ELM_WIDGET_CLASS(sc)->theme = _elm_diskselector_smart_theme; ELM_WIDGET_CLASS(sc)->event = _elm_diskselector_smart_event; - //XXX: ACCESS - if (_elm_config->access_mode == ELM_ACCESS_MODE_ON) + /* access */ + if (_elm_config->access_mode) ELM_WIDGET_CLASS(sc)->focus_next = _elm_diskselector_smart_focus_next; - ELM_WIDGET_CLASS(sc)->access = _access_hook; + ELM_WIDGET_CLASS(sc)->access = _elm_diskselector_smart_access; } EAPI const Elm_Diskselector_Smart_Class * diff --git a/src/lib/elm_label.c b/src/lib/elm_label.c index 6a1abe7..4860f83 100644 --- a/src/lib/elm_label.c +++ b/src/lib/elm_label.c @@ -398,6 +398,24 @@ _elm_label_smart_add(Evas_Object *obj) elm_layout_sizing_eval(obj); } +static Eina_Bool +_elm_label_smart_activate(Evas_Object *obj, Elm_Activate act) +{ + Elm_Access_Info *ac; + + if (!_elm_config->access_mode) return EINA_FALSE; + + if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE; + + ac = _elm_access_object_get(obj); + if (!ac) return EINA_FALSE; + if (!ac->activate) return EINA_FALSE; + + ac->activate(ac->activate_data, obj, NULL); + + return EINA_TRUE; +} + static void _elm_label_smart_set_user(Elm_Label_Smart_Class *sc) { @@ -406,6 +424,7 @@ _elm_label_smart_set_user(Elm_Label_Smart_Class *sc) /* not a 'focus chain manager' */ ELM_WIDGET_CLASS(sc)->focus_next = NULL; ELM_WIDGET_CLASS(sc)->focus_direction = NULL; + ELM_WIDGET_CLASS(sc)->activate = _elm_label_smart_activate; ELM_WIDGET_CLASS(sc)->theme = _elm_label_smart_theme; ELM_WIDGET_CLASS(sc)->translate = _elm_label_smart_translate; diff --git a/src/modules/datetime_input_ctxpopup/datetime_input_ctxpopup.c b/src/modules/datetime_input_ctxpopup/datetime_input_ctxpopup.c index 2de764f..7863dca 100644 --- a/src/modules/datetime_input_ctxpopup/datetime_input_ctxpopup.c +++ b/src/modules/datetime_input_ctxpopup/datetime_input_ctxpopup.c @@ -374,7 +374,50 @@ _field_mouse_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event } static void -_access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type) +_access_activate_cb(void *data, + Evas_Object *part_obj, + Elm_Object_Item *item __UNUSED__) +{ + Evas_Object *obj; + Ctxpopup_Module_Data *ctx_mod; + char buf[BUFF_SIZE]; + + ctx_mod = (Ctxpopup_Module_Data *)data; + if (!ctx_mod) return; + + obj = part_obj; + + if (!ctx_mod->ctxpopup) + { + ctx_mod->ctxpopup = elm_ctxpopup_add(obj); + snprintf(buf, sizeof(buf), "datetime/%s", elm_object_style_get(ctx_mod->mod_data.base)); + elm_object_style_set(ctx_mod->ctxpopup, buf); + elm_ctxpopup_horizontal_set(ctx_mod->ctxpopup, EINA_TRUE); + evas_object_size_hint_weight_set(ctx_mod->ctxpopup, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ctx_mod->ctxpopup, EVAS_HINT_FILL, 0.5); + elm_ctxpopup_hover_parent_set(ctx_mod->ctxpopup, elm_widget_top_get(obj)); + evas_object_event_callback_add(ctx_mod->ctxpopup, EVAS_CALLBACK_HIDE, + _ctxpopup_hide_cb, ctx_mod); + } + + if (evas_object_visible_get(ctx_mod->ctxpopup) && ctx_mod->sel_field != obj) + { + if (ctx_mod->sel_field) + elm_object_signal_emit(ctx_mod->sel_field, "elm,state,unselect", "elm"); + ctx_mod->sel_field = obj; + ctx_mod->ctxpopup_relaunch = 1; + evas_object_hide(ctx_mod->ctxpopup); + } + else if (ctx_mod->sel_field != obj) + { + ctx_mod->ctxpopup_relaunch = 0; + _field_clicked_cb(ctx_mod, obj); + } +} + +static void +_access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type, Elm_Datetime_Module_Data *module_data) { const char* type = NULL; @@ -412,6 +455,11 @@ _access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type) (_elm_access_object_get(obj), ELM_ACCESS_TYPE, type); _elm_access_callback_set (_elm_access_object_get(obj), ELM_ACCESS_STATE, NULL, NULL); + + if ((field_type >= ELM_DATETIME_YEAR) && + (field_type < ELM_DATETIME_AMPM)) + _elm_access_activate_callback_set + (_elm_access_object_get(obj), _access_activate_cb, module_data); } // module fucns for the specific module type @@ -468,7 +516,7 @@ field_create(Elm_Datetime_Module_Data *module_data, Elm_Datetime_Field_Type fie evas_object_data_set(field_obj, "_field_type", (void *)field_type); // ACCESS - _access_set(field_obj, field_type); + _access_set(field_obj, field_type, ctx_mod); return field_obj; } -- 2.7.4