forked from enlightenment/efl
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:
parent
175b25ab2e
commit
976b9d877e
|
@ -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_event_callback_add(efl_added, EFL_UI_EVENT_CLICKED, _dec_clicked, sp),
|
||||||
efl_pack(bx, efl_added));
|
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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#endif
|
#endif
|
||||||
#include <Elementary.h>
|
#include <Elementary.h>
|
||||||
|
|
||||||
|
#define NUM_OF_VALS 12
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_spin_delay_changed_cb(void *data EINA_UNUSED, const Efl_Event *ev)
|
_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)
|
test_ui_spin_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Eo *win, *bx;
|
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(),
|
win = efl_add(EFL_UI_WIN_CLASS, efl_main_loop_get(),
|
||||||
efl_ui_win_type_set(efl_added, EFL_UI_WIN_BASIC),
|
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_ui_spin_button_editable_set(efl_added, EINA_FALSE),
|
||||||
efl_pack(bx, efl_added));
|
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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,8 +73,24 @@ _is_label_format_integer(const char *fmt)
|
||||||
static void
|
static void
|
||||||
_label_write(Evas_Object *obj)
|
_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);
|
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)
|
if (sd->format_cb)
|
||||||
{
|
{
|
||||||
const char *buf;
|
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;
|
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 *
|
EOLIAN static Eo *
|
||||||
_efl_ui_spin_efl_object_constructor(Eo *obj, Efl_Ui_Spin_Data *sd)
|
_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->val_max = 100.0;
|
||||||
sd->step = 1.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,
|
if (!elm_widget_theme_object_set(obj, wd->resize_obj,
|
||||||
elm_widget_theme_klass_get(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
|
EOLIAN static void
|
||||||
_efl_ui_spin_efl_object_destructor(Eo *obj, Efl_Ui_Spin_Data *sd EINA_UNUSED)
|
_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);
|
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));
|
efl_destructor(efl_super(obj, MY_CLASS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
class Efl.Ui.Spin (Efl.Ui.Layout.Object, Efl.Ui.Range, Efl.Ui.Format,
|
||||||
Efl.Access.Value, Efl.Access.Widget.Action)
|
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
|
@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 {
|
implements {
|
||||||
Efl.Object.constructor;
|
Efl.Object.constructor;
|
||||||
Efl.Object.destructor;
|
Efl.Object.destructor;
|
||||||
|
|
|
@ -50,9 +50,22 @@ EFL_CALLBACKS_ARRAY_DEFINE(_inc_dec_button_cb,
|
||||||
static void
|
static void
|
||||||
_entry_show(Evas_Object *obj)
|
_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_Button_Data *sd = efl_data_scope_get(obj, MY_CLASS);
|
||||||
Efl_Ui_Spin_Data *pd = efl_data_scope_get(obj, EFL_UI_SPIN_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
|
/* try to construct just the format from given label
|
||||||
* completely ignoring pre/post words
|
* completely ignoring pre/post words
|
||||||
|
@ -169,6 +182,9 @@ _entry_hide(Evas_Object *obj)
|
||||||
static void
|
static void
|
||||||
_entry_value_apply(Evas_Object *obj)
|
_entry_value_apply(Evas_Object *obj)
|
||||||
{
|
{
|
||||||
|
Efl_Ui_Spin_Special_Value *sv;
|
||||||
|
Eina_Array_Iterator iterator;
|
||||||
|
unsigned int i;
|
||||||
const char *str;
|
const char *str;
|
||||||
double val;
|
double val;
|
||||||
char *end;
|
char *end;
|
||||||
|
@ -184,6 +200,10 @@ _entry_value_apply(Evas_Object *obj)
|
||||||
str = elm_object_text_get(sd->ent);
|
str = elm_object_text_get(sd->ent);
|
||||||
if (!str) return;
|
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);
|
val = strtod(str, &end);
|
||||||
if (((*end != '\0') && (!isspace(*end))) || (fabs(val - pd->val) < DBL_EPSILON)) return;
|
if (((*end != '\0') && (!isspace(*end))) || (fabs(val - pd->val) < DBL_EPSILON)) return;
|
||||||
efl_ui_range_value_set(obj, val);
|
efl_ui_range_value_set(obj, val);
|
||||||
|
|
|
@ -24,6 +24,8 @@ struct _Efl_Ui_Spin_Data
|
||||||
Eina_Free_Cb format_free_cb;
|
Eina_Free_Cb format_free_cb;
|
||||||
void *format_cb_data;
|
void *format_cb_data;
|
||||||
Eina_Strbuf *format_strbuf;
|
Eina_Strbuf *format_strbuf;
|
||||||
|
|
||||||
|
Eina_Array *special_values;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue