raster pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=adfe7fbcd3f4146d84219de7dbb5a273d89f396e
commit adfe7fbcd3f4146d84219de7dbb5a273d89f396e Author: Subodh Kumar <s7158.ku...@samsung.com> Date: Wed Mar 4 15:59:24 2015 +0900 Elm_spinner focus UI, accessibility fix Summary: Issue: Focus was not getting transferred individually on arrow buttons and text area. Solution: Remove the usage of image parts and text parts and replace them with buttons so as to handle the focus transfer normally than forcibly via smart event. hence Focus next hook and focus direction hook is implemented. Signed-off by: Subodh Kumar<s7158.ku...@samsung.com> Signed-off by: Shilpa Singh<shilpa.si...@samsung.com> Test Plan: Use keyboard keys on spinner and test focus transfer, enable accessibility and test accessibility. Reviewers: woohyun, Hermet, shilpasingh, raster, seoz Reviewed By: shilpasingh, raster Subscribers: stefan_schmidt, raster, rajeshps, govi Differential Revision: https://phab.enlightenment.org/D1911 --- AUTHORS | 1 + data/themes/edc/elm/button.edc | 303 ++++++++++++++++++++++ data/themes/edc/elm/entry.edc | 5 + data/themes/edc/elm/spinner.edc | 331 +++++++++--------------- src/lib/elm_authors.h | 1 + src/lib/elm_spinner.c | 557 +++++++++++++++++++++------------------- src/lib/elm_spinner.eo | 3 +- src/lib/elm_widget_spinner.h | 2 +- 8 files changed, 725 insertions(+), 478 deletions(-) diff --git a/AUTHORS b/AUTHORS index 0a80fa5..1e0a28e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -162,3 +162,4 @@ Woochan Lee <wc0917....@samsung.com> Vitalii Vorobiov <vi.vorob...@samsung.com> Jee-Yong Um <con...@gmail.com> Ji-In Moon <jiin.m...@samsung.com> +Subodh Kumar <s7158.ku...@samsung.com> diff --git a/data/themes/edc/elm/button.edc b/data/themes/edc/elm/button.edc index 03c3356..938bee7 100644 --- a/data/themes/edc/elm/button.edc +++ b/data/themes/edc/elm/button.edc @@ -1328,3 +1328,306 @@ group { name: "elm/button/base/hoversel_horizontal_entry/default"; } } } + +/******************* SPINNER BUTTONS STYLES **********************/ + group { name: "elm/button/base/spinner/increase/default"; + images.image: "sym_right_light_normal.png" COMP; + images.image: "sym_right_glow_normal.png" COMP; + images.image: "sym_right_dark_normal.png" COMP; + script { + public mouse_down = 0; + public multi_down = 0; + } + parts { + part { name: "arrow.image"; + scale: 1; + description { state: "default" 0.0; + min: 15 15; + max: 15 15; + color_class: "F032L1"; + image.normal: "sym_right_light_normal.png"; + } + description { state: "pressed" 0.0; + inherit: "default" 0.0; + image.normal: "sym_right_glow_normal.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + image.normal: "sym_right_dark_normal.png"; + } + } + part { name: "over"; + type: RECT; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_press"; + signal: "mouse,down,1"; + source: "over"; + script { + if ((get_int(multi_down) == 0) && + (get_int(mouse_down) == 0)) { + set_int(mouse_down, 1); + run_program(PROGRAM:"button_press2"); + } + } + } + program { name: "button_press2"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_press_anim"; + } + program { name: "button_press_anim"; + action: STATE_SET "pressed" 0.0; + target: "arrow.image"; + } + program { name: "button_unpress"; + signal: "mouse,up,1"; + source: "over"; + script { + if (get_int(mouse_down) == 1) { + set_int(mouse_down, 0); + run_program(PROGRAM:"button_unpress2"); + run_program(PROGRAM:"button_unpress_anim"); + } + } + } + program { name: "button_unpress2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { name: "button_unpress_anim"; + action: STATE_SET "default" 0.0; + target: "arrow.image"; + } + program { name: "button_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + if (get_int(multi_down) == 0) { + run_program(PROGRAM:"button_click2"); + } + } + } + program { name: "action_unpressed"; + signal: "elm,action,unpressed"; + source: "elm"; + after: "button_unpress_anim"; + } + program { name: "action_pressed"; + signal: "elm,action,pressed"; + source: "elm"; + after: "button_press_anim"; + } + program { name: "button_click2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "access_pressed"; + signal: "elm,action,anim,activate"; + source: "elm"; + action: STATE_SET "pressed" 0.0; + target: "arrow.image"; + after: "access_pressed_anim"; + } + program { name: "access_pressed_anim"; + action: STATE_SET "default" 0.0; + transition: DECELERATE 0.1; + target: "arrow.image"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "arrow.image"; + target: "disabler"; + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "arrow.image"; + target: "disabler"; + } + program { + name: "multi_down"; + signal: "elm,action,multi,down"; + source: "elm"; + script { + set_int(multi_down, 1); + } + } + program { + name: "multi_up"; + signal: "elm,action,multi,up"; + source: "elm"; + script { + set_int(multi_down, 0); + } + } + } + } + + group { name: "elm/button/base/spinner/decrease/default"; + inherit: "elm/button/base/spinner/increase/default"; + images.image: "sym_left_light_normal.png" COMP; + images.image: "sym_left_glow_normal.png" COMP; + images.image: "sym_left_dark_normal.png" COMP; + parts { + part { name: "arrow.image"; + scale: 1; + description { state: "default" 0.0; + min: 15 15; + max: 15 15; + image.normal: "sym_left_light_normal.png"; + } + description { state: "pressed" 0.0; + inherit: "default" 0.0; + image.normal: "sym_left_glow_normal.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + image.normal: "sym_left_dark_normal.png"; + } + } + } + } + + group { name: "elm/button/base/spinner/default"; + alias: "elm/button/base/spinner/vertical"; + parts { + part { name: "bg"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + } + } + part { name: "elm.text"; + type: TEXT; + scale: 1; + effect: SHADOW BOTTOM; + description { state: "default" 0.0; + color: FN_COL_DEFAULT; + color_class: "spinner"; + rel1.to: "bg"; + rel2.to: "bg"; + text { font: FN; size: 10; + min: 1 1; + text_class: "spinner"; + ellipsis: -1; + } + } + description { state: "disabled" 0.0; + inherit: "default" 0 0 ; + color: FN_COL_DISABLE; + color_class: "spinner_disabled"; + } + } + part { name: "over"; + type: RECT; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "disabler"; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "button_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + run_program(PROGRAM:"button_click2"); + } + } + program { name: "button_click2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "disabler"; + target: "elm.text"; + } + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "disabler"; + target: "elm.text"; + } + } + } + group { name: "elm/button/base/spinner/increase/vertical"; + inherit: "elm/button/base/spinner/increase/default"; + images.image: "sym_up_light_normal.png" COMP; + images.image: "sym_up_glow_normal.png" COMP; + images.image: "sym_up_dark_normal.png" COMP; + parts { + part { name: "arrow.image"; + scale: 1; + description { state: "default" 0.0; + min: 15 15; + max: 15 15; + image.normal: "sym_up_light_normal.png"; + } + description { state: "pressed" 0.0; + inherit: "default" 0.0; + image.normal: "sym_up_glow_normal.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + image.normal: "sym_up_dark_normal.png"; + } + } + } + } + + group { name: "elm/button/base/spinner/decrease/vertical"; + inherit: "elm/button/base/spinner/decrease/default"; + images.image: "sym_down_light_normal.png" COMP; + images.image: "sym_down_glow_normal.png" COMP; + images.image: "sym_down_dark_normal.png" COMP; + parts { + part { name: "arrow.image"; + scale: 1; + description { state: "default" 0.0; + min: 15 15; + max: 15 15; + image.normal: "sym_down_light_normal.png"; + } + description { state: "pressed" 0.0; + inherit: "default" 0.0; + image.normal: "sym_down_glow_normal.png"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + image.normal: "sym_down_dark_normal.png"; + } + } + } + } +/******************* SPINNER BUTTONS STYLES END **********************/ \ No newline at end of file diff --git a/data/themes/edc/elm/entry.edc b/data/themes/edc/elm/entry.edc index f82b84e..cf836fc 100644 --- a/data/themes/edc/elm/entry.edc +++ b/data/themes/edc/elm/entry.edc @@ -768,6 +768,11 @@ group { name: "elm/entry/base-single/default"; } } +group { name: "elm/entry/base-single/spinner/default"; + alias: "elm/entry/base-single/spinner/vertical"; + inherit: "elm/entry/base-single/default"; +} + group { name: "elm/entry/base-single-noedit/default"; inherit: "elm/entry/base/default"; parts { diff --git a/data/themes/edc/elm/spinner.edc b/data/themes/edc/elm/spinner.edc index a631eae..ca87047 100644 --- a/data/themes/edc/elm/spinner.edc +++ b/data/themes/edc/elm/spinner.edc @@ -1,136 +1,64 @@ group { name: "elm/spinner/base/default"; images.image: "vert_bar_inset.png" COMP; - images.image: "sym_left_light_normal.png" COMP; - images.image: "sym_left_glow_normal.png" COMP; - images.image: "sym_left_dark_normal.png" COMP; - images.image: "sym_right_light_normal.png" COMP; - images.image: "sym_right_glow_normal.png" COMP; - images.image: "sym_right_dark_normal.png" COMP; parts { - part { name: "elm.text"; type: TEXT; - effect: SHADOW BOTTOM; + part { name: "bg"; + type: SPACER; scale: 1; description { state: "default" 0.0; - color: FN_COL_DEFAULT; - color_class: "spinner"; - rel1.to_y: "inset"; - rel1.to_x: "left"; - rel1.relative: 1.0 0.0; - rel1.offset: 1 1; - rel2.to_y: "inset"; - rel2.to_x: "right"; - rel2.relative: 0.0 1.0; - rel2.offset: -2 -2; - text { font: FN; size: 10; - min: 1 1; - text_class: "spinner"; - ellipsis: -1; - } - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - color: FN_COL_DISABLE; - color_class: "spinner_disabled"; - } - description { state: "active" 0.0; - inherit: "default" 0.0; - visible: 0; } } - part { name: "elm.dragable.slider"; type: RECT; - dragable.x: 1 1 0; - dragable.y: 0 0 0; + part { name: "inset"; mouse_events: 0; description { state: "default" 0.0; - fixed: 1 0; - rel1.to: "inset"; - rel2.to: "inset"; - color: 0 0 0 0; + rel1.offset: 0 1; + rel2.offset: -1 -2; + image.normal: "vert_bar_inset.png"; + image.border: 1 1 8 6; + image.middle: 0; + fill.smooth: 0; } } - part { name: "elm.swallow.entry"; type: SWALLOW; + part { name: "access"; + type: RECT; + repeat_events: 1; description { state: "default" 0.0; - fixed: 1 0; - rel1.to: "elm.text"; - rel2.to: "elm.text"; + fixed: 1 1; + color: 0 0 0 0; + rel1.to: "inset"; + rel2.to: "inset"; visible: 0; } description { state: "active" 0.0; inherit: "default" 0.0; visible: 1; } - description { state: "disabled_active" 0.0; - inherit: "default" 0.0; - visible: 0; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - visible: 0; - } } - part { name: "arrow1"; mouse_events: 0; - scale: 1; + part { name: "elm.dragable.slider"; type: RECT; + dragable.x: 1 1 0; + dragable.y: 0 0 0; description { state: "default" 0.0; - rel1.to: "left"; - rel2.to: "left"; - image.normal: "sym_left_light_normal.png"; - FIXED_SIZE(15, 15) - } - description { state: "clicked" 0.0; - inherit: "default" 0.0; - image.normal: "sym_left_glow_normal.png"; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - image.normal: "sym_left_dark_normal.png"; + fixed: 1 0; + rel1.to: "inset"; + rel2.to: "inset"; + color: 0 0 0 0; } } - part { name: "arrow2"; mouse_events: 0; + part { name: "elm.swallow.dec_button"; + type: SWALLOW; scale: 1; description { state: "default" 0.0; - rel1.to: "right"; - rel2.to: "right"; - image.normal: "sym_right_light_normal.png"; - FIXED_SIZE(15, 15) - } - description { state: "clicked" 0.0; - inherit: "default" 0.0; - image.normal: "sym_right_glow_normal.png"; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - image.normal: "sym_right_dark_normal.png"; - } - } - part { name: "left"; type: RECT; - description { state: "default" 0.0; rel1.to: "inset"; rel1.offset: 1 1; rel2.to: "inset"; rel2.offset: 1 -2; rel2.relative: 0.0 1.0; align: 0.0 0.5; - color: 0 0 0 0; min: 15 15; aspect: 1.0 1.0; aspect_preference: VERTICAL; } } - program { - signal: "mouse,down,1"; source: "left"; - action: STATE_SET "clicked" 0.0; - target: "arrow1"; - after: "left2"; - } program { name: "left2"; - action: SIGNAL_EMIT "elm,action,decrement,start" "elm"; - } - program { - signal: "mouse,up,1"; source: "left"; - action: STATE_SET "default" 0.0; - target: "arrow1"; - after: "left3"; - } program { name: "left3"; - action: SIGNAL_EMIT "elm,action,decrement,stop" "elm"; - } - part { name: "right"; type: RECT; + part { name: "elm.swallow.inc_button"; + type: SWALLOW; + scale: 1; description { state: "default" 0.0; rel1.to: "inset"; rel1.offset: 1 1; @@ -138,53 +66,46 @@ group { name: "elm/spinner/base/default"; rel2.to: "inset"; rel2.offset: 1 -2; align: 1.0 0.5; - color: 0 0 0 0; min: 15 15; aspect: 1.0 1.0; aspect_preference: VERTICAL; } } - program { - signal: "mouse,down,1"; source: "right"; - action: STATE_SET "clicked" 0.0; - target: "arrow2"; - after: "right2"; - } program { name: "right2"; - action: SIGNAL_EMIT "elm,action,increment,start" "elm"; - } - program { - signal: "mouse,up,1"; source: "right"; - action: STATE_SET "default" 0.0; - target: "arrow2"; - after: "right3"; - } program { name: "right3"; - action: SIGNAL_EMIT "elm,action,increment,stop" "elm"; - } - part { name: "inset"; mouse_events: 0; + part { name: "elm.swallow.text_button"; + type: SWALLOW; + scale: 1; description { state: "default" 0.0; - rel1.offset: 0 1; - rel2.offset: -1 -2; - image.normal: "vert_bar_inset.png"; - image.border: 1 1 8 6; - image.middle: 0; - fill.smooth: 0; + visible: 1; + rel1.to_y: "inset"; + rel1.to_x: "elm.swallow.dec_button"; + rel1.relative: 1.0 0.0; + rel1.offset: 1 1; + rel2.to_y: "inset"; + rel2.to_x: "elm.swallow.inc_button"; + rel2.relative: 0.0 1.0; + rel2.offset: -2 -2; + } + description { state: "inactive" 0.0; + inherit: "default" 0.0; + visible: 0; } } - part { name: "access_text"; type: RECT; repeat_events: 1; + part { name: "elm.swallow.entry"; + type: SWALLOW; description { state: "default" 0.0; - color: 0 0 0 0; - rel1.to: "elm.text"; - rel2.to: "elm.text"; + fixed: 1 0; + rel1.to: "elm.swallow.text_button"; + rel2.to: "elm.swallow.text_button"; + visible: 0; } - description { state: "disabled" 0.0; + description { state: "active" 0.0; inherit: "default" 0.0; - visible: 0; + visible: 1; } } - program { - signal: "mouse,clicked,1"; source: "access_text"; - action: SIGNAL_EMIT "elm,action,click" "elm"; - } - part { name: "disabler"; type: RECT; + part { name: "disabler"; + type: RECT; + repeat_events: 0; + mouse_events: 0; description { state: "default" 0.0; color: 0 0 0 0; visible: 0; @@ -196,107 +117,101 @@ group { name: "elm/spinner/base/default"; } } programs { - program { name: "active"; - signal: "elm,state,active"; source: "elm"; + program { name: "entry_active"; + signal: "elm,state,entry,active"; + source: "elm"; action: STATE_SET "active" 0.0; - target: "elm.text"; target: "elm.swallow.entry"; } - program { name: "inactive"; - signal: "elm,state,inactive"; source: "elm"; + program { name: "entry_inactive"; + signal: "elm,state,entry,inactive"; + source: "elm"; action: STATE_SET "default" 0.0; - target: "elm.text"; target: "elm.swallow.entry"; } - program { name: "toggle_text"; - signal: "mouse,clicked,1"; source: "elm.dragable.slider"; - action: SIGNAL_EMIT "elm,action,entry,toggle" "elm"; - } - program { - signal: "elm,state,enabled"; source: "elm"; + program { name: "text_button_active"; + signal: "elm,state,button,active"; + source: "elm"; action: STATE_SET "default" 0.0; - target: "arrow1"; - target: "arrow2"; - target: "access_text"; + target: "elm.swallow.text_button"; + } + program { name: "text_button_inactive"; + signal: "elm,state,button,inactive"; + source: "elm"; + action: STATE_SET "inactive" 0.0; + target: "elm.swallow.text_button"; + } + program { name: "access_activate"; + signal: "elm,state,access,active"; + source: "elm"; + action: STATE_SET "active" 0.0; + target: "access"; + } + program { name: "access_inactivate"; + signal: "elm,state,access,inactive"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "access"; + } + program { name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; target: "disabler"; - target: "elm.swallow.entry"; - target: "elm.text"; } - program { - signal: "elm,state,disabled"; source: "elm"; - action: STATE_SET "disabled" 0.0; - target: "arrow1"; - target: "arrow2"; - target: "access_text"; + program { name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; target: "disabler"; - target: "elm.swallow.entry"; - target: "elm.text"; } } } group { name: "elm/spinner/base/vertical"; inherit: "elm/spinner/base/default"; - images.image: "sym_up_light_normal.png" COMP; - images.image: "sym_up_glow_normal.png" COMP; - images.image: "sym_up_dark_normal.png" COMP; - images.image: "sym_down_light_normal.png" COMP; - images.image: "sym_down_glow_normal.png" COMP; - images.image: "sym_down_dark_normal.png" COMP; parts { - part { name: "elm.text"; + part { name: "elm.swallow.inc_button"; + type: SWALLOW; + scale: 1; description { state: "default" 0.0; - rel1.to_x: "inset"; - rel1.relative: 0.0 0.0; + rel1.to: "inset"; rel1.offset: 1 1; - rel2.to_x: "left"; + rel1.relative: 1.0 0.0; + rel2.to: "inset"; + rel2.offset: 1 -2; + align: 1.0 0.5; + } + } + part { name: "elm.swallow.text_button"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 1; + rel1.to_y: "inset"; + rel1.to_x: "elm.swallow.dec_button"; + rel1.relative: 1.0 0.0; + rel1.offset: 1 1; + rel2.to_y: "inset"; + rel2.to_x: "elm.swallow.inc_button"; rel2.relative: 0.0 1.0; rel2.offset: -2 -2; } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - color: FN_COL_DISABLE; - color_class: "spinner_disabled"; - } description { state: "active" 0.0; inherit: "default" 0.0; visible: 0; } } - part { name: "arrow1"; mouse_events: 0; - description { state: "default" 0.0; - image.normal: "sym_down_light_normal.png"; - } - description { state: "clicked" 0.0; - inherit: "default" 0.0; - image.normal: "sym_down_glow_normal.png"; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - image.normal: "sym_down_dark_normal.png"; - } - } - part { name: "arrow2"; mouse_events: 0; - description { state: "default" 0.0; - image.normal: "sym_up_light_normal.png"; - FIXED_SIZE(15, 15) - } - description { state: "clicked" 0.0; - inherit: "default" 0.0; - image.normal: "sym_up_glow_normal.png"; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - image.normal: "sym_up_dark_normal.png"; - } - } - part { name: "left"; + part { name: "elm.swallow.dec_button"; + type: SWALLOW; + scale: 1; description { state: "default" 0.0; - rel1.to: "right"; - rel1.offset: -1 0; - rel2.to: "right"; - rel2.offset: -1 -1; - align: 1.0 0.5; + rel1.to: "inset"; + rel1.offset: 1 1; + rel2.to: "inset"; + rel2.offset: 1 -2; + rel2.relative: 0.0 1.0; + align: 0.0 0.5; } } } diff --git a/src/lib/elm_authors.h b/src/lib/elm_authors.h index 10e9193..f4cf2f9 100644 --- a/src/lib/elm_authors.h +++ b/src/lib/elm_authors.h @@ -160,6 +160,7 @@ * @author Jae Yong Hwang <j_yong.hwang@@samsung.com> * @author Kabeer Khan <kabeer.khan@@samsung.com> * @author yinsc <shouchen.yin@@samsung.com> + * @author Subodh Kumar <s7158.ku...@samsung.com> * * Please contact <enlightenment-devel@lists.sourceforge.net> to get in * contact with the developers and maintainers. diff --git a/src/lib/elm_spinner.c b/src/lib/elm_spinner.c index 1ae00c7..51668fb 100644 --- a/src/lib/elm_spinner.c +++ b/src/lib/elm_spinner.c @@ -38,14 +38,8 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = { {NULL, NULL} }; -static Eina_Bool _key_action_spin(Evas_Object *obj, const char *params); -static Eina_Bool _key_action_toggle(Evas_Object *obj, const char *params); - -static const Elm_Action key_actions[] = { - {"spin", _key_action_spin}, - {"toggle", _key_action_toggle}, - {NULL, NULL} -}; +static void _access_increment_decrement_info_say(Evas_Object *obj, + Eina_Bool is_incremented); static void _entry_show(Elm_Spinner_Data *sd) @@ -108,13 +102,14 @@ _label_write(Evas_Object *obj) goto apply; } } + if (sd->label) snprintf(buf, sizeof(buf), sd->label, sd->val); else snprintf(buf, sizeof(buf), "%.0f", sd->val); apply: - elm_layout_text_set(obj, "elm.text", buf); + elm_layout_text_set(sd->text_button, "elm.text", buf); elm_interface_atspi_accessible_name_changed_signal_emit(obj); if (sd->entry_visible) _entry_show(sd); } @@ -197,8 +192,13 @@ _drag_cb(void *data, ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); if (sd->entry_visible) return; - eo_do((Eo *)wd->resize_obj, - edje_obj_part_drag_value_get("elm.dragable.slider", &pos, NULL)); + + if (!strncmp(elm_widget_style_get(obj), "vertical", 8)) + eo_do((Eo *)wd->resize_obj, + edje_obj_part_drag_value_get("elm.dragable.slider", NULL, &pos)); + else + eo_do((Eo *)wd->resize_obj, + edje_obj_part_drag_value_get("elm.dragable.slider", &pos, NULL)); delta = pos * sd->step * _elm_config->scale; /* If we are on rtl mode, change the delta to be negative on such changes */ @@ -241,7 +241,8 @@ _entry_hide(Evas_Object *obj) { ELM_SPINNER_DATA_GET(obj, sd); - elm_layout_signal_emit(obj, "elm,state,inactive", "elm"); + elm_layout_signal_emit(obj, "elm,state,entry,inactive", "elm"); + elm_layout_signal_emit(obj, "elm,state,button,active", "elm"); sd->entry_visible = EINA_FALSE; } @@ -279,10 +280,21 @@ _entry_activated_cb(void *data, } static void -_entry_toggle_cb(void *data EINA_UNUSED, - Evas_Object *obj, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) +_entry_show_cb(void *data, + Evas *e EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + ELM_SPINNER_DATA_GET(data, sd); + _entry_show(sd); + elm_object_focus_set(obj, EINA_TRUE); + elm_entry_select_all(obj); + sd->entry_visible = EINA_TRUE; + elm_layout_signal_emit(data, "elm,state,button,inactive", "elm"); +} + +static void +_toggle_entry(Evas_Object *obj) { ELM_SPINNER_DATA_GET(obj, sd); @@ -299,20 +311,30 @@ _entry_toggle_cb(void *data EINA_UNUSED, if (!sd->ent) { sd->ent = elm_entry_add(obj); + Eina_Strbuf *buf = eina_strbuf_new(); + eina_strbuf_append_printf(buf, "spinner/%s", elm_widget_style_get(obj)); + elm_widget_style_set(sd->ent, eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); elm_entry_single_line_set(sd->ent, EINA_TRUE); evas_object_smart_callback_add (sd->ent, "activated", _entry_activated_cb, obj); + evas_object_event_callback_add + (sd->ent, EVAS_CALLBACK_SHOW, _entry_show_cb, obj); elm_layout_content_set(obj, "elm.swallow.entry", sd->ent); } - - elm_layout_signal_emit(obj, "elm,state,active", "elm"); - _entry_show(sd); - elm_entry_select_all(sd->ent); - elm_widget_focus_set(sd->ent, EINA_TRUE); - sd->entry_visible = EINA_TRUE; + elm_layout_signal_emit(obj, "elm,state,entry,active", "elm"); } } +static void +_entry_toggle_cb(void *data EINA_UNUSED, + Evas_Object *obj, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + _toggle_entry(obj); +} + static Eina_Bool _spin_value(void *data) { @@ -375,168 +397,118 @@ _spin_stop(Evas_Object *obj) } static void -_button_inc_start_cb(void *data, - Evas_Object *obj, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) +_inc_button_clicked_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { ELM_SPINNER_DATA_GET(data, sd); - if (sd->entry_visible) - { - _entry_value_apply(obj); - if ((sd->val_updated) && (sd->val == sd->val_min)) return; - } - ecore_timer_del(sd->longpress_timer); - sd->longpress_timer = ecore_timer_add - (_elm_config->longpress_timeout, _val_inc_start, data); -} - -static void -_button_inc_stop_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - ELM_SPINNER_DATA_GET(data, sd); - if (sd->longpress_timer) - { - ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del); - sd->spin_speed = sd->step; - _spin_value(data); - } _spin_stop(data); + sd->spin_speed = sd->step; + _spin_value(data); + + if (sd->entry_visible) _entry_value_apply(data); + if (_elm_config->access_mode) + _access_increment_decrement_info_say(data, EINA_TRUE); } static void -_button_dec_start_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) +_inc_button_pressed_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { ELM_SPINNER_DATA_GET(data, sd); - if (sd->entry_visible) - { - _entry_value_apply(obj); - if ((sd->val_updated) && (sd->val == sd->val_max)) return; - } - ecore_timer_del(sd->longpress_timer); + if (sd->longpress_timer) ecore_timer_del(sd->longpress_timer); sd->longpress_timer = ecore_timer_add - (_elm_config->longpress_timeout, _val_dec_start, data); + (_elm_config->longpress_timeout, + _val_inc_start, data); + + if (sd->entry_visible) _entry_value_apply(data); } static void -_button_dec_stop_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) +_inc_button_unpressed_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { ELM_SPINNER_DATA_GET(data, sd); + if (sd->longpress_timer) { - ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del); - sd->spin_speed = -sd->step; - _spin_value(data); + ecore_timer_del(sd->longpress_timer); + sd->longpress_timer = NULL; } _spin_stop(data); } -EOLIAN static void -_elm_spinner_elm_layout_sizing_eval(Eo *obj, Elm_Spinner_Data *_pd EINA_UNUSED) +static void +_text_button_clicked_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { - Evas_Coord minw = -1, minh = -1; - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - elm_coords_finger_size_adjust(1, &minw, 1, &minh); - edje_object_size_min_restricted_calc - (wd->resize_obj, &minw, &minh, minw, minh); - evas_object_size_hint_min_set(obj, minw, minh); - evas_object_size_hint_max_set(obj, -1, -1); + _toggle_entry(data); } -static Eina_Bool -_key_action_spin(Evas_Object *obj, const char *params) +static void +_dec_button_clicked_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { - const char *dir = params; - Eina_Bool horz = !!strncmp(elm_widget_style_get(obj), "vertical", 8); + ELM_SPINNER_DATA_GET(data, sd); - if (((!strcmp(dir, "left")) && horz) || - ((!strcmp(dir, "down")) && !horz)) - { - _val_dec_start(obj); - elm_layout_signal_emit(obj, "elm,left,anim,activate", "elm"); - } - else if (((!strcmp(dir, "right")) && horz) || - ((!strcmp(dir, "up")) && !horz)) - { - _val_inc_start(obj); - elm_layout_signal_emit(obj, "elm,right,anim,activate", "elm"); - } - else return EINA_FALSE; + _spin_stop(data); + sd->spin_speed = -sd->step; + _spin_value(data); - return EINA_TRUE; + if (sd->entry_visible) _entry_value_apply(data); + + if (_elm_config->access_mode) + _access_increment_decrement_info_say(data, EINA_FALSE); } -static Eina_Bool -_key_action_toggle(Evas_Object *obj, const char *params EINA_UNUSED) +static void +_dec_button_pressed_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { - ELM_SPINNER_DATA_GET(obj, sd); + ELM_SPINNER_DATA_GET(data, sd); - if (sd->spin_timer) _spin_stop(obj); - else _entry_toggle_cb(NULL, obj, NULL, NULL); + if (sd->longpress_timer) ecore_timer_del(sd->longpress_timer); + sd->longpress_timer = ecore_timer_add + (_elm_config->longpress_timeout, + _val_dec_start, data); - return EINA_FALSE; + if (sd->entry_visible) _entry_value_apply(data); } -EOLIAN static Eina_Bool -_elm_spinner_elm_widget_event(Eo *obj, Elm_Spinner_Data *sd EINA_UNUSED, Evas_Object *src, Evas_Callback_Type type, void *event_info) +static void +_dec_button_unpressed_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { - Evas_Event_Key_Down *ev = event_info; - Evas_Event_Mouse_Wheel *mev; - (void) src; + ELM_SPINNER_DATA_GET(data, sd); - if (type == EVAS_CALLBACK_KEY_DOWN) - { - Eina_Bool ret; - - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; - ret = _elm_config_key_binding_call(obj, ev, key_actions); - if (!ret) - { - if (sd->spin_timer) _spin_stop(obj); - else return EINA_FALSE; - } - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - } - else if (type == EVAS_CALLBACK_KEY_UP) + if (sd->longpress_timer) { - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; - if (sd->spin_timer) _spin_stop(obj); - else return EINA_FALSE; - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + ecore_timer_del(sd->longpress_timer); + sd->longpress_timer = NULL; } - else if (type == EVAS_CALLBACK_MOUSE_WHEEL) - { - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; - mev = event_info; - sd->interval = sd->first_interval; - if (mev->z < 0) - { - sd->spin_speed = sd->step; - elm_layout_signal_emit(obj, "elm,right,anim,activate", "elm"); - } - else - { - sd->spin_speed = -sd->step; - elm_layout_signal_emit(obj, "elm,left,anim,activate", "elm"); - } - _spin_value(obj); - mev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - } - else return EINA_FALSE; + _spin_stop(data); +} - return EINA_TRUE; +EOLIAN static void +_elm_spinner_elm_layout_sizing_eval(Eo *obj, Elm_Spinner_Data *_pd EINA_UNUSED) +{ + Evas_Coord minw = -1, minh = -1; + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + + elm_coords_finger_size_adjust(1, &minw, 1, &minh); + edje_object_size_min_restricted_calc + (wd->resize_obj, &minw, &minh, minw, minh); + elm_coords_finger_size_adjust(1, &minw, 1, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, -1, -1); } EOLIAN static Eina_Bool @@ -558,13 +530,18 @@ _elm_spinner_elm_widget_on_focus(Eo *obj, Elm_Spinner_Data *sd) } static char * -_access_info_cb(void *data, Evas_Object *obj) +_access_info_cb(void *data, Evas_Object *obj EINA_UNUSED) { Evas_Object *spinner; - const char *txt = elm_widget_access_info_get(obj); + const char *txt = NULL; + + spinner = (Evas_Object *)(data); + ELM_SPINNER_DATA_GET(spinner, sd); - spinner = data; - if (!txt) txt = elm_layout_text_get(spinner, "elm.text"); + if (sd->entry_visible) + txt = elm_object_text_get(sd->ent); + else + txt = elm_object_text_get(sd->text_button); if (txt) return strdup(txt); return NULL; @@ -580,46 +557,45 @@ _access_state_cb(void *data, Evas_Object *obj EINA_UNUSED) } static void -_access_activate_cb(void *data, - Evas_Object *part_obj, - Elm_Object_Item *item EINA_UNUSED) +_access_activate_spinner_cb(void *data, + Evas_Object *part_obj EINA_UNUSED, + Elm_Object_Item *item EINA_UNUSED) { - char *text; - Eina_Strbuf *buf; - Evas_Object *eo, *inc_btn; - const char* increment_part; + ELM_SPINNER_DATA_GET(data, sd); - if (!strncmp(elm_widget_style_get(data), "vertical", 8)) - increment_part = "up_bt"; - else - increment_part = "right_bt"; + if (elm_widget_disabled_get(data)) return; + if (!sd->entry_visible) + _toggle_entry(data); +} - eo = elm_layout_edje_get(data); - inc_btn = (Evas_Object *)edje_object_part_object_get(eo, increment_part); +static void +_access_increment_decrement_info_say(Evas_Object *obj, + Eina_Bool is_incremented) +{ + char *text; + Eina_Strbuf *buf; - if (part_obj != inc_btn) - { - _val_dec_start(data); - elm_layout_signal_emit(data, "elm,left,anim,activate", "elm"); - _spin_stop(data); - text = "decremented"; - } - else - { - _val_inc_start(data); - elm_layout_signal_emit(data, "elm,right,anim,activate", "elm"); - _spin_stop(data); - text = "incremented"; - } + ELM_SPINNER_DATA_GET(obj, sd); - buf = eina_strbuf_new(); + buf = eina_strbuf_new(); + if (is_incremented) + { + elm_object_signal_emit + (sd->inc_button, "elm,action,anim,activate", "elm"); + eina_strbuf_append(buf, E_("incremented")); + } + else + { + elm_object_signal_emit + (sd->dec_button, "elm,action,anim,activate", "elm"); + eina_strbuf_append(buf, E_("decremented")); + } - eina_strbuf_append_printf(buf, "%s, %s", text, - elm_layout_text_get(data, "elm.text")); + eina_strbuf_append_printf + (buf, "%s", elm_object_text_get(sd->text_button)); text = eina_strbuf_string_steal(buf); eina_strbuf_free(buf); - _elm_access_say(text); } @@ -628,61 +604,41 @@ _access_spinner_register(Evas_Object *obj, Eina_Bool is_access) { Evas_Object *ao; Elm_Access_Info *ai; - const char* increment_part; - const char* decrement_part; - if (!strncmp(elm_widget_style_get(obj), "vertical", 8)) - { - increment_part = "up_bt"; - decrement_part = "down_bt"; - } - else - { - increment_part = "right_bt"; - decrement_part = "left_bt"; - } + ELM_SPINNER_DATA_GET(obj, sd); if (!is_access) { - /* unregister increment button, decrement button and spinner label */ - _elm_access_edje_object_part_object_unregister - (obj, elm_layout_edje_get(obj), increment_part); - - _elm_access_edje_object_part_object_unregister - (obj, elm_layout_edje_get(obj), decrement_part); - - _elm_access_edje_object_part_object_unregister - (obj, elm_layout_edje_get(obj), "access.text"); - + /* unregister access */ + _elm_access_edje_object_part_object_unregister + (obj, elm_layout_edje_get(obj), "access"); + elm_layout_signal_emit(obj, "elm,state,access,inactive", "elm"); return; } - - /* register increment button */ + elm_layout_signal_emit(obj, "elm,state,access,active", "elm"); ao = _elm_access_edje_object_part_object_register - (obj, elm_layout_edje_get(obj), increment_part); + (obj, elm_layout_edje_get(obj), "access"); ai = _elm_access_info_get(ao); - _elm_access_text_set(ai, ELM_ACCESS_TYPE, - E_("spinner increment button")); - _elm_access_activate_callback_set(ai, _access_activate_cb, obj); + _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("spinner")); + _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, obj); + _elm_access_activate_callback_set(ai, _access_activate_spinner_cb, obj); - /* register decrement button */ - ao = _elm_access_edje_object_part_object_register - (obj, elm_layout_edje_get(obj), decrement_part); + /*Do not register spinner buttons if widget is disabled*/ + if (!elm_widget_disabled_get(obj)) + { + ai = _elm_access_info_get(sd->inc_button); + _elm_access_text_set(ai, ELM_ACCESS_TYPE, + E_("spinner increment button")); - ai = _elm_access_info_get(ao); - _elm_access_text_set(ai, ELM_ACCESS_TYPE, - E_("spinner decrement button")); - _elm_access_activate_callback_set(ai, _access_activate_cb, obj); + ai = _elm_access_info_get(sd->dec_button); + _elm_access_text_set(ai, ELM_ACCESS_TYPE, + E_("spinner decrement button")); - /* register spinner label */ - ao = _elm_access_edje_object_part_object_register - (obj, elm_layout_edje_get(obj), "access.text"); - - ai = _elm_access_info_get(ao); - _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("spinner")); - _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, obj); - _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, obj); + ai = _elm_access_info_get(sd->text_button); + _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("spinner text")); + _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, obj); + } } EOLIAN static void @@ -707,14 +663,42 @@ _elm_spinner_evas_object_smart_add(Eo *obj, Elm_Spinner_Data *priv) elm_layout_signal_callback_add(obj, "drag,step", "*", _drag_stop_cb, obj); elm_layout_signal_callback_add(obj, "drag,page", "*", _drag_stop_cb, obj); - elm_layout_signal_callback_add - (obj, "elm,action,increment,start", "*", _button_inc_start_cb, obj); - elm_layout_signal_callback_add - (obj, "elm,action,increment,stop", "*", _button_inc_stop_cb, obj); - elm_layout_signal_callback_add - (obj, "elm,action,decrement,start", "*", _button_dec_start_cb, obj); - elm_layout_signal_callback_add - (obj, "elm,action,decrement,stop", "*", _button_dec_stop_cb, obj); + priv->inc_button = elm_button_add(obj); + elm_object_style_set(priv->inc_button, "spinner/increase/default"); + + evas_object_smart_callback_add + (priv->inc_button, "clicked", _inc_button_clicked_cb, obj); + evas_object_smart_callback_add + (priv->inc_button, "pressed", _inc_button_pressed_cb, obj); + evas_object_smart_callback_add + (priv->inc_button, "unpressed", _inc_button_unpressed_cb, obj); + + elm_layout_content_set(obj, "elm.swallow.inc_button", priv->inc_button); + elm_widget_sub_object_add(obj, priv->inc_button); + + priv->text_button = elm_button_add(obj); + elm_object_style_set(priv->text_button, "spinner/default"); + + evas_object_smart_callback_add + (priv->text_button, "clicked", _text_button_clicked_cb, obj); + + elm_layout_content_set(obj, "elm.swallow.text_button", priv->text_button); + elm_widget_sub_object_add(obj, priv->text_button); + + + priv->dec_button = elm_button_add(obj); + elm_object_style_set(priv->dec_button, "spinner/decrease/default"); + + evas_object_smart_callback_add + (priv->dec_button, "clicked", _dec_button_clicked_cb, obj); + evas_object_smart_callback_add + (priv->dec_button, "pressed", _dec_button_pressed_cb, obj); + evas_object_smart_callback_add + (priv->dec_button, "unpressed", _dec_button_unpressed_cb, obj); + + elm_layout_content_set(obj, "elm.swallow.dec_button", priv->dec_button); + elm_widget_sub_object_add(obj, priv->dec_button); + edje_object_part_drag_value_set (wd->resize_obj, "elm.dragable.slider", 0.0, 0.0); @@ -755,22 +739,53 @@ _elm_spinner_evas_object_smart_del(Eo *obj, Elm_Spinner_Data *sd) } EOLIAN static Eina_Bool -_elm_spinner_elm_widget_theme_apply(Eo *obj, Elm_Spinner_Data *sd EINA_UNUSED) +_elm_spinner_elm_widget_theme_apply(Eo *obj, Elm_Spinner_Data *sd) { Eina_Bool int_ret = elm_layout_theme_set(obj, "spinner", "base", elm_widget_style_get(obj)); if (!int_ret) CRI("Failed to set layout!"); + if (sd->ent) + { + Eina_Strbuf *buf = eina_strbuf_new(); + eina_strbuf_append_printf(buf, "spinner/%s", elm_widget_style_get(obj)); + elm_widget_style_set(sd->ent, eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); + } + + if (sd->inc_button) + { + Eina_Strbuf *buf = eina_strbuf_new(); + eina_strbuf_append_printf(buf, "spinner/increase/%s", elm_widget_style_get(obj)); + elm_widget_style_set(sd->inc_button, eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); + } + + if (sd->text_button) + { + Eina_Strbuf *buf = eina_strbuf_new(); + eina_strbuf_append_printf(buf, "spinner/%s", elm_widget_style_get(obj)); + elm_widget_style_set(sd->text_button, eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); + } + + if (sd->dec_button) + { + Eina_Strbuf *buf = eina_strbuf_new(); + eina_strbuf_append_printf(buf, "spinner/decrease/%s", elm_widget_style_get(obj)); + elm_widget_style_set(sd->dec_button, eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); + } + if (_elm_config->access_mode) _access_spinner_register(obj, EINA_TRUE); elm_layout_sizing_eval(obj); - return int_ret; } -static Eina_Bool _elm_spinner_smart_focus_next_enable = EINA_FALSE; +static Eina_Bool _elm_spinner_smart_focus_next_enable = EINA_TRUE; EOLIAN static Eina_Bool _elm_spinner_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Spinner_Data *_pd EINA_UNUSED) @@ -781,7 +796,34 @@ _elm_spinner_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Spinner_D EOLIAN static Eina_Bool _elm_spinner_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Spinner_Data *_pd EINA_UNUSED) { - return EINA_FALSE; + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_spinner_elm_widget_focus_direction(Eo *obj, Elm_Spinner_Data *_pd, const Evas_Object *base, double degree, Evas_Object **direction, double *weight) +{ + Eina_Bool ret; + Eina_List *items = NULL; + void *(*list_data_get)(const Eina_List *list); + + ELM_SPINNER_CHECK(obj) EINA_FALSE; + + if (!_pd) + return EINA_FALSE; + + list_data_get = eina_list_data_get; + items = eina_list_append(items, _pd->inc_button); + if (_pd->entry_visible) + items = eina_list_append(items, _pd->ent); + else + items = eina_list_append(items, _pd->text_button); + items = eina_list_append(items, _pd->dec_button); + + ret = elm_widget_focus_list_direction_get + (obj, base, items, list_data_get, degree, direction, weight); + eina_list_free(items); + + return ret; } static Evas_Object * @@ -798,34 +840,28 @@ _access_object_get(const Evas_Object *obj, const char* part) } EOLIAN static Eina_Bool -_elm_spinner_elm_widget_focus_next(Eo *obj, Elm_Spinner_Data *_pd EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next) +_elm_spinner_elm_widget_focus_next(Eo *obj, Elm_Spinner_Data *_pd, Elm_Focus_Direction dir, Evas_Object **next) { Evas_Object *ao; - Eina_List *items = NULL; - const char* increment_part; - const char* decrement_part; - if (!strncmp(elm_widget_style_get(obj), "vertical", 8)) + ELM_SPINNER_CHECK(obj) EINA_FALSE; + + if (_elm_config->access_mode) { - increment_part = "up_bt"; - decrement_part = "down_bt"; + ao = _access_object_get(obj, "access"); + items = eina_list_append(items, ao); } - else + if (!elm_widget_disabled_get(obj)) { - increment_part = "right_bt"; - decrement_part = "left_bt"; - } - - ao = _access_object_get(obj, "access.text"); - items = eina_list_append(items, ao); - - ao = _access_object_get(obj, decrement_part); - items = eina_list_append(items, ao); - - ao = _access_object_get(obj, increment_part); - items = eina_list_append(items, ao); + items = eina_list_append(items, _pd->dec_button); + items = eina_list_append(items, _pd->inc_button); + if (_pd->entry_visible) + items = eina_list_append(items, _pd->ent); + else + items = eina_list_append(items, _pd->text_button); + } return elm_widget_focus_list_next_get (obj, items, eina_list_data_get, dir, next); } @@ -1103,19 +1139,6 @@ _elm_spinner_elm_interface_atspi_accessible_name_get(Eo *obj, Elm_Spinner_Data * return elm_layout_text_get(obj, "elm.text"); } -EOLIAN static const Elm_Atspi_Action* -_elm_spinner_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Spinner_Data *sd EINA_UNUSED) -{ - static Elm_Atspi_Action atspi_actions[] = { - { "spin,left", "spin", "left", _key_action_spin}, - { "spin,right", "spin", "right", _key_action_spin}, - { "spin,up", "spin", "up", _key_action_spin}, - { "spin,down", "spin", "down", _key_action_spin}, - { "toggle", "toggle", NULL, _key_action_toggle}, - { NULL, NULL, NULL, NULL } - }; - return &atspi_actions[0]; -} // A11Y Accessibility - END #include "elm_spinner.eo.c" diff --git a/src/lib/elm_spinner.eo b/src/lib/elm_spinner.eo index ed31d4a..0c02ede 100644 --- a/src/lib/elm_spinner.eo +++ b/src/lib/elm_spinner.eo @@ -371,15 +371,14 @@ class Elm_Spinner (Elm_Layout, Elm_Interface_Atspi_Value, Elm_Interface_Atspi_Wi Elm_Widget.focus_direction_manager_is; Elm_Widget.access; Elm_Widget.focus_next; + Elm_Widget.focus_direction; Elm_Widget.on_focus; - Elm_Widget.event; Elm_Layout.sizing_eval; Elm_Interface_Atspi_Accessible.name.get; Elm_Interface_Atspi_Value.value_and_text.get; Elm_Interface_Atspi_Value.value_and_text.set; Elm_Interface_Atspi_Value.range.get; Elm_Interface_Atspi_Value.increment.get; - Elm_Interface_Atspi_Widget_Action.elm_actions.get; } events { changed; diff --git a/src/lib/elm_widget_spinner.h b/src/lib/elm_widget_spinner.h index 838f571..73e410a 100644 --- a/src/lib/elm_widget_spinner.h +++ b/src/lib/elm_widget_spinner.h @@ -28,7 +28,7 @@ typedef struct _Elm_Spinner_Data Elm_Spinner_Data; struct _Elm_Spinner_Data { - Evas_Object *ent; + Evas_Object *ent, *inc_button, *dec_button, *text_button; const char *label; double val, val_min, val_max, val_base; double step; /**< step for the value change. 1 by default. */ --