summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwoochan lee <wc0917.lee@samsung.com>2015-11-09 16:28:19 -0800
committerCedric BAIL <cedric@osg.samsung.com>2015-11-09 16:28:22 -0800
commit4b0f40e472c416e5547acf95068ad59c5fd3f8d2 (patch)
treea0b2cde9a1eb03b8796faf5515be493e851b7b34
parent4421aee9d5aef3b670e5ab860d2a0a785c458486 (diff)
downloadelementary-4b0f40e472c416e5547acf95068ad59c5fd3f8d2.tar.gz
spinner: add entry filter for accepted only digits and "."
Summary: When spinner activated with entry, user can input any characters in entry. It degrades the usability. Add filter for only can input numbers and "." for case of decimal point existing. I will add entry filter for limit size as well after this commit. This spinner features may help for app developer and users too. @feature Test Plan: Run elementary_test Test various spinner format for check this. Reviewers: Hermet, cedric Subscribers: id213sin, shilpasingh Differential Revision: https://phab.enlightenment.org/D3299 Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
-rw-r--r--src/lib/elm_spinner.c47
-rw-r--r--src/lib/elm_widget_spinner.h1
2 files changed, 48 insertions, 0 deletions
diff --git a/src/lib/elm_spinner.c b/src/lib/elm_spinner.c
index db3781a20..61b3a5832 100644
--- a/src/lib/elm_spinner.c
+++ b/src/lib/elm_spinner.c
@@ -390,6 +390,47 @@ _entry_activated_cb(void *data,
return EINA_TRUE;
}
+static int
+_decimal_points_get(const char *label)
+{
+ char result[2];
+ const char *start = strchr(label, '%');
+
+ while (start)
+ {
+ if (start[1] != '%')
+ {
+ start = strchr(start, '.');
+ start++;
+ break;
+ }
+ else
+ start = strchr(start + 2, '%');
+ }
+
+ sscanf(start, "%[^f]", result);
+
+ return atoi(result);
+}
+
+static void
+_entry_filter_add(Evas_Object *obj)
+{
+ ELM_SPINNER_DATA_GET(obj, sd);
+ static Elm_Entry_Filter_Accept_Set digits_filter_data;
+
+ if (!sd->ent) return;
+
+ elm_entry_markup_filter_remove(sd->ent, elm_entry_filter_accept_set, &digits_filter_data);
+
+ if (sd->decimal_points > 0)
+ digits_filter_data.accepted = ".0123456789";
+ else
+ digits_filter_data.accepted = "0123456789";
+
+ elm_entry_markup_filter_append(sd->ent, elm_entry_filter_accept_set, &digits_filter_data);
+}
+
static void
_entry_show_cb(void *data,
Evas *e EINA_UNUSED,
@@ -435,6 +476,7 @@ _toggle_entry(Evas_Object *obj)
eo_do(sd->ent, eo_event_callback_add
(ELM_ENTRY_EVENT_ACTIVATED, _entry_activated_cb, obj));
elm_layout_content_set(obj, "elm.swallow.entry", sd->ent);
+ _entry_filter_add(obj);
}
if (!sd->button_layout)
{
@@ -1315,8 +1357,13 @@ EOLIAN static void
_elm_spinner_label_format_set(Eo *obj, Elm_Spinner_Data *sd, const char *fmt)
{
eina_stringshare_replace(&sd->label, fmt);
+
+ if (fmt && !(_is_label_format_integer(sd->label)))
+ sd->decimal_points = _decimal_points_get(sd->label);
+
_label_write(obj);
elm_layout_sizing_eval(obj);
+ _entry_filter_add(obj);
}
EOLIAN static const char*
diff --git a/src/lib/elm_widget_spinner.h b/src/lib/elm_widget_spinner.h
index 151b704ea..4287eecc2 100644
--- a/src/lib/elm_widget_spinner.h
+++ b/src/lib/elm_widget_spinner.h
@@ -35,6 +35,7 @@ struct _Elm_Spinner_Data
double drag_prev_pos, drag_val_step;
double spin_speed, interval, first_interval;
int round;
+ int decimal_points;
Ecore_Timer *delay_change_timer; /**< a timer for a delay,changed smart callback */
Ecore_Timer *spin_timer; /**< a timer for a repeated spinner value change on mouse down */
Ecore_Timer *longpress_timer; /**< a timer to detect long press. After lonpress timeout,