From dd9ff4aa966bf1913dea23dbb7044796bbe278da Mon Sep 17 00:00:00 2001 From: Shilpa Singh Date: Fri, 12 Feb 2016 20:38:36 +0100 Subject: [PATCH] spinner: add min, max filter Summary: In spinner's entry allow numbers only with in min/max range Signed-off-by: Shilpa Singh @feature Test Plan: 1. Set min/max value to spinner 2. Enter numbers beyond min/max value Reviewers: CHAN, cedric Reviewed By: cedric Subscribers: subodh6129, buds, govi, CHAN, cedric, raster, id213sin Differential Revision: https://phab.enlightenment.org/D3265 Signed-off-by: Cedric BAIL --- legacy/elementary/config/default/base.src.in | 1 + legacy/elementary/config/mobile/base.src.in | 1 + legacy/elementary/config/standard/base.src.in | 1 + legacy/elementary/src/lib/elm_config.c | 4 ++ legacy/elementary/src/lib/elm_priv.h | 1 + legacy/elementary/src/lib/elm_spinner.c | 54 ++++++++++++++++++- 6 files changed, 61 insertions(+), 1 deletion(-) diff --git a/legacy/elementary/config/default/base.src.in b/legacy/elementary/config/default/base.src.in index 6a488c41b7..f48f4a4008 100644 --- a/legacy/elementary/config/default/base.src.in +++ b/legacy/elementary/config/default/base.src.in @@ -98,6 +98,7 @@ group "Elm_Config" struct { value "naviframe_prev_btn_auto_pushed" uchar: 1; value "popup_horizontal_align" double: 0.5; value "popup_vertical_align" double: 0.5; + value "spinner_min_max_filter_enable" uchar: 0; group "color_palette" list { group "Elm_Custom_Palette" struct { value "palette_name" string: "default"; diff --git a/legacy/elementary/config/mobile/base.src.in b/legacy/elementary/config/mobile/base.src.in index d3ec42ec01..8eca4b8f04 100644 --- a/legacy/elementary/config/mobile/base.src.in +++ b/legacy/elementary/config/mobile/base.src.in @@ -102,6 +102,7 @@ group "Elm_Config" struct { value "naviframe_prev_btn_auto_pushed" uchar: 1; value "popup_horizontal_align" double: 0.5; value "popup_vertical_align" double: 0.5; + value "spinner_min_max_filter_enable" uchar: 1; group "color_palette" list { group "Elm_Custom_Palette" struct { value "palette_name" string: "default"; diff --git a/legacy/elementary/config/standard/base.src.in b/legacy/elementary/config/standard/base.src.in index 6e8196c16e..37c2cda1bf 100644 --- a/legacy/elementary/config/standard/base.src.in +++ b/legacy/elementary/config/standard/base.src.in @@ -99,6 +99,7 @@ group "Elm_Config" struct { value "naviframe_prev_btn_auto_pushed" uchar: 1; value "popup_horizontal_align" double: 0.5; value "popup_vertical_align" double: 0.5; + value "spinner_min_max_filter_enable" uchar: 0; group "color_palette" list { group "Elm_Custom_Palette" struct { value "palette_name" string: "default"; diff --git a/legacy/elementary/src/lib/elm_config.c b/legacy/elementary/src/lib/elm_config.c index d28ebbadc3..723924814b 100644 --- a/legacy/elementary/src/lib/elm_config.c +++ b/legacy/elementary/src/lib/elm_config.c @@ -496,6 +496,7 @@ _desc_init(void) ELM_CONFIG_VAL(D, T, naviframe_prev_btn_auto_pushed, T_UCHAR); ELM_CONFIG_VAL(D, T, popup_horizontal_align, T_DOUBLE); ELM_CONFIG_VAL(D, T, popup_vertical_align, T_DOUBLE); + ELM_CONFIG_VAL(D, T, spinner_min_max_filter_enable, T_UCHAR); #undef T #undef D #undef T_INT @@ -1797,6 +1798,7 @@ _config_load(void) _elm_config->indicator_service_270 = eina_stringshare_add("elm_indicator_landscape"); _elm_config->disable_external_menu = EINA_FALSE; _elm_config->magnifier_enable = EINA_TRUE; + _elm_config->spinner_min_max_filter_enable = EINA_FALSE; _elm_config->magnifier_scale = 1.5; _elm_config->audio_mute_effect = 0; _elm_config->audio_mute_background = 0; @@ -2497,6 +2499,8 @@ _env_get(void) if (s) _elm_config->magnifier_scale = _elm_atof(s); s = getenv("ELM_ATSPI_MODE"); if (s) _elm_config->atspi_mode = ELM_ATSPI_MODE_ON; + s = getenv("ELM_SPINNER_MIN_MAX_FILTER_ENABLE"); + if (s) _elm_config->spinner_min_max_filter_enable = !!atoi(s); s = getenv("ELM_TRANSITION_DURATION_FACTOR"); if (s) _elm_config->transition_duration_factor = atof(s); diff --git a/legacy/elementary/src/lib/elm_priv.h b/legacy/elementary/src/lib/elm_priv.h index 82915a52ef..a1dcb50c01 100644 --- a/legacy/elementary/src/lib/elm_priv.h +++ b/legacy/elementary/src/lib/elm_priv.h @@ -308,6 +308,7 @@ struct _Elm_Config unsigned char win_auto_focus_animate; double transition_duration_factor; unsigned char naviframe_prev_btn_auto_pushed; + unsigned char spinner_min_max_filter_enable; Eina_List *bindings; Eina_Bool atspi_mode; int gl_depth; diff --git a/legacy/elementary/src/lib/elm_spinner.c b/legacy/elementary/src/lib/elm_spinner.c index 65ffee4d0e..45674bdadc 100644 --- a/legacy/elementary/src/lib/elm_spinner.c +++ b/legacy/elementary/src/lib/elm_spinner.c @@ -81,7 +81,7 @@ _is_label_format_integer(const char *fmt) if ((*itr == 'd') || (*itr == 'u') || (*itr == 'i') || (*itr == 'o') || (*itr == 'x') || (*itr == 'X')) return EINA_TRUE; - else if ((*itr == 'f')) + else if ((*itr == 'f') || (*itr == 'F')) return EINA_FALSE; } @@ -421,6 +421,56 @@ _entry_filter_add(Evas_Object *obj) elm_entry_markup_filter_append(sd->ent, elm_entry_filter_accept_set, &digits_filter_data); } +char * +_text_insert(const char *text, const char *input, int pos) +{ + char *result = NULL; + int text_len, input_len; + + text_len = evas_string_char_len_get(text); + input_len = evas_string_char_len_get(input); + result = (char *)calloc(text_len + input_len + 1, sizeof(char)); + if (!result) return NULL; + + strncpy(result, text, pos); + strcpy(result + pos, input); + strcpy(result + pos + input_len, text + pos); + + return result; +} + +static void +_min_max_validity_filter(void *data, Evas_Object *obj, char **text) +{ + const char *str, *new_str; + char *insert; + double val; + int max_len, len; + + EINA_SAFETY_ON_NULL_RETURN(data); + EINA_SAFETY_ON_NULL_RETURN(obj); + EINA_SAFETY_ON_NULL_RETURN(text); + + ELM_SPINNER_DATA_GET(data, sd); + + str = elm_object_text_get(obj); + if (!str) return; + + insert = *text; + new_str = _text_insert(str, insert, elm_entry_cursor_pos_get(obj)); + if (!new_str) return; + + max_len = log10(abs(sd->val_max)) + 1; + len = evas_string_char_len_get(new_str); + if (len < max_len) return; + + val = strtod(new_str, NULL); + ELM_SAFE_FREE(new_str, free); + + if ((val < sd->val_min) || (val > sd->val_max)) + *insert = 0; +} + static void _entry_show_cb(void *data, Evas *e EINA_UNUSED, @@ -468,6 +518,8 @@ _toggle_entry(Evas_Object *obj) (ELM_ENTRY_EVENT_ACTIVATED, _entry_activated_cb, obj)); elm_layout_content_set(obj, "elm.swallow.entry", sd->ent); _entry_filter_add(obj); + if (_elm_config->spinner_min_max_filter_enable) + elm_entry_markup_filter_append(sd->ent, _min_max_validity_filter, obj); } if (!sd->button_layout) {