efl_ui_spin: Added special value feature.

Summary:
User may want to set as meanignful words for the value instead of numberic value.

@feature

Test Plan: elementary_test->test_ui_spin_button.

Reviewers: cedric, woohyun, Jaehyun_Cho, herb

Reviewed By: Jaehyun_Cho

Subscribers: zmike, felipealmeida, cedric

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D5969
This commit is contained in:
Woochan Lee 2018-05-20 03:01:44 +09:00 committed by Jaehyun Cho
parent 175b25ab2e
commit 976b9d877e
6 changed files with 142 additions and 3 deletions

View File

@ -65,5 +65,5 @@ test_ui_spin(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_i
efl_event_callback_add(efl_added, EFL_UI_EVENT_CLICKED, _dec_clicked, sp),
efl_pack(bx, efl_added));
efl_gfx_entity_size_set(win, EINA_SIZE2D(100, 80));
efl_gfx_entity_size_set(win, EINA_SIZE2D(100, 120));
}

View File

@ -3,6 +3,8 @@
#endif
#include <Elementary.h>
#define NUM_OF_VALS 12
static void
_spin_delay_changed_cb(void *data EINA_UNUSED, const Efl_Event *ev)
{
@ -13,6 +15,17 @@ void
test_ui_spin_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Eo *win, *bx;
int i;
Eina_Array *array;
Efl_Ui_Spin_Special_Value values[12] = {
{1, "January"}, {2, "February"}, {3, "March"}, {4, "April"},
{5, "May"}, {6, "June"}, {7, "July"}, {8, "August"},
{9, "September"}, {10, "October"}, {11, "November"}, {12, "December"}
};
array = eina_array_new(sizeof(Efl_Ui_Spin_Special_Value));
for (i = 0; i < NUM_OF_VALS; i++)
eina_array_push(array, &values[i]);
win = efl_add(EFL_UI_WIN_CLASS, efl_main_loop_get(),
efl_ui_win_type_set(efl_added, EFL_UI_WIN_BASIC),
@ -39,5 +52,13 @@ test_ui_spin_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *
efl_ui_spin_button_editable_set(efl_added, EINA_FALSE),
efl_pack(bx, efl_added));
efl_gfx_entity_size_set(win, EINA_SIZE2D(180, 100));
efl_add(EFL_UI_SPIN_BUTTON_CLASS, bx,
efl_ui_range_min_max_set(efl_added, 1, 12),
efl_ui_range_value_set(efl_added, 1),
efl_ui_spin_button_editable_set(efl_added, EINA_FALSE),
efl_ui_spin_special_value_set(efl_added, array),
efl_pack(bx, efl_added));
eina_array_free(array);
efl_gfx_entity_size_set(win, EINA_SIZE2D(180, 140));
}

View File

@ -73,8 +73,24 @@ _is_label_format_integer(const char *fmt)
static void
_label_write(Evas_Object *obj)
{
Efl_Ui_Spin_Special_Value *sv;
unsigned int i;
Eina_Array_Iterator iterator;
Efl_Ui_Spin_Data *sd = efl_data_scope_get(obj, MY_CLASS);
EINA_ARRAY_ITER_NEXT(sd->special_values, i, sv, iterator)
{
if (sv->value == sd->val)
{
char buf[1024];
snprintf(buf, sizeof(buf), "%s", sv->label);
elm_layout_text_set(obj, "elm.text", buf);
sd->templates = sv->label;
return;
}
}
if (sd->format_cb)
{
const char *buf;
@ -172,6 +188,48 @@ _efl_ui_spin_efl_ui_widget_widget_event(Eo *obj, Efl_Ui_Spin_Data *sd, const Efl
return EINA_TRUE;
}
EOLIAN static void
_efl_ui_spin_special_value_set(Eo *obj, Efl_Ui_Spin_Data *sd, const Eina_Array *values)
{
EINA_SAFETY_ON_NULL_RETURN(values);
unsigned int i;
Efl_Ui_Spin_Special_Value *sv;
Efl_Ui_Spin_Special_Value *temp;
Eina_Array_Iterator iterator;
if (eina_array_count(sd->special_values))
{
EINA_ARRAY_ITER_NEXT(sd->special_values, i, sv, iterator)
{
eina_stringshare_del(sv->label);
free(sv);
}
eina_array_clean(sd->special_values);
}
if (eina_array_count(values))
EINA_ARRAY_ITER_NEXT(values, i, temp, iterator)
{
sv = calloc(1, sizeof(*sv));
if (!sv) return;
sv->value = temp->value;
sv->label = eina_stringshare_add(temp->label);
eina_array_push(sd->special_values, sv);
}
_label_write(obj);
}
EOLIAN static const Eina_Array*
_efl_ui_spin_special_value_get(const Eo *obj EINA_UNUSED, Efl_Ui_Spin_Data *sd)
{
if (eina_array_count(sd->special_values))
return sd->special_values;
else
return NULL;
}
EOLIAN static Eo *
_efl_ui_spin_efl_object_constructor(Eo *obj, Efl_Ui_Spin_Data *sd)
{
@ -185,6 +243,7 @@ _efl_ui_spin_efl_object_constructor(Eo *obj, Efl_Ui_Spin_Data *sd)
sd->val_max = 100.0;
sd->step = 1.0;
sd->special_values = eina_array_new(sizeof(Efl_Ui_Spin_Special_Value));
if (!elm_widget_theme_object_set(obj, wd->resize_obj,
elm_widget_theme_klass_get(obj),
@ -203,7 +262,19 @@ _efl_ui_spin_efl_object_constructor(Eo *obj, Efl_Ui_Spin_Data *sd)
EOLIAN static void
_efl_ui_spin_efl_object_destructor(Eo *obj, Efl_Ui_Spin_Data *sd EINA_UNUSED)
{
Efl_Ui_Spin_Special_Value *sv;
Eina_Array_Iterator iterator;
unsigned int i;
efl_ui_format_cb_set(obj, NULL, NULL, NULL);
EINA_ARRAY_ITER_NEXT(sd->special_values, i, sv, iterator)
{
eina_stringshare_del(sv->label);
free(sv);
}
eina_array_free(sd->special_values);
efl_destructor(efl_super(obj, MY_CLASS));
}

View File

@ -1,3 +1,10 @@
struct Efl.Ui.Spin_Special_Value
{
[[Special value]]
value: double; [[Target value]]
label: string; [[String to replace]]
}
class Efl.Ui.Spin (Efl.Ui.Layout.Object, Efl.Ui.Range, Efl.Ui.Format,
Efl.Access.Value, Efl.Access.Widget.Action)
{
@ -8,6 +15,24 @@ class Efl.Ui.Spin (Efl.Ui.Layout.Object, Efl.Ui.Range, Efl.Ui.Format,
@since 1.21
]]
methods {
@property special_value {
[[Control special string to display in the place of the numerical value.
It's useful for cases when a user should select an item that is
better indicated by a label than a value. For example, weekdays or months.
Note: If another label was previously set to $value, it will be replaced
by the new label.]]
set {
}
get {
}
values {
values: const(array<ptr(Efl.Ui.Spin_Special_Value)>); [[The array of special values, or NULL if none]]
}
}
}
implements {
Efl.Object.constructor;
Efl.Object.destructor;

View File

@ -50,9 +50,22 @@ EFL_CALLBACKS_ARRAY_DEFINE(_inc_dec_button_cb,
static void
_entry_show(Evas_Object *obj)
{
Efl_Ui_Spin_Special_Value *sv;
Eina_Array_Iterator iterator;
unsigned int i;
char buf[32], fmt[32] = "%0.f";
Efl_Ui_Spin_Button_Data *sd = efl_data_scope_get(obj, MY_CLASS);
Efl_Ui_Spin_Data *pd = efl_data_scope_get(obj, EFL_UI_SPIN_CLASS);
char buf[32], fmt[32] = "%0.f";
EINA_ARRAY_ITER_NEXT(pd->special_values, i, sv, iterator)
{
if (sv->value == pd->val)
{
snprintf(buf, sizeof(buf), "%s", sv->label);
elm_object_text_set(sd->ent, buf);
}
}
/* try to construct just the format from given label
* completely ignoring pre/post words
@ -169,6 +182,9 @@ _entry_hide(Evas_Object *obj)
static void
_entry_value_apply(Evas_Object *obj)
{
Efl_Ui_Spin_Special_Value *sv;
Eina_Array_Iterator iterator;
unsigned int i;
const char *str;
double val;
char *end;
@ -184,6 +200,10 @@ _entry_value_apply(Evas_Object *obj)
str = elm_object_text_get(sd->ent);
if (!str) return;
EINA_ARRAY_ITER_NEXT(pd->special_values, i, sv, iterator)
if (sv->value == pd->val)
if (!strcmp(sv->label, str)) return;
val = strtod(str, &end);
if (((*end != '\0') && (!isspace(*end))) || (fabs(val - pd->val) < DBL_EPSILON)) return;
efl_ui_range_value_set(obj, val);

View File

@ -24,6 +24,8 @@ struct _Efl_Ui_Spin_Data
Eina_Free_Cb format_free_cb;
void *format_cb_data;
Eina_Strbuf *format_strbuf;
Eina_Array *special_values;
};
#endif