On 04/15/2010 11:52 AM, Rafael Fonseca wrote:
The following patch add the capability to replace numerical values by
strings in elm_spinner as already is done by e_slider.
Just a little modification in the patch adding the option to make the
spinner not editable. That way the user can go through the options only
by the buttons or dragging and the real value behind the special one is
not shown.
--
Rafael Fonseca
ProFUSION embedded systems
http://www.profusion.mobi
>From e3b43bff6695e75548aaea6357d43f8503360284 Mon Sep 17 00:00:00 2001
From: Rafael Fonseca <[email protected]>
Date: Wed, 14 Apr 2010 16:12:56 -0300
Subject: [PATCH] Add special values to spinner.
Special value is a string showed instead a numerical one.
---
src/bin/test_spinner.c | 22 ++++++++++++
src/lib/Elementary.h.in | 3 ++
src/lib/elm_spinner.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 111 insertions(+), 0 deletions(-)
diff --git a/src/bin/test_spinner.c b/src/bin/test_spinner.c
index 5d421a0..d57a8ed 100644
--- a/src/bin/test_spinner.c
+++ b/src/bin/test_spinner.c
@@ -59,6 +59,28 @@ test_spinner(void *data, Evas_Object *obj, void *event_info)
elm_box_pack_end(bx, sp);
evas_object_show(sp);
+ sp = elm_spinner_add(win);
+ elm_spinner_min_max_set(sp, 1, 12);
+ elm_spinner_label_format_set(sp, "%.0f");
+ elm_spinner_step_set(sp, 1.0);
+ elm_spinner_editable_set(sp, EINA_FALSE);
+ elm_spinner_special_value_add(sp, 1, "January");
+ elm_spinner_special_value_add(sp, 2, "February");
+ elm_spinner_special_value_add(sp, 3, "March");
+ elm_spinner_special_value_add(sp, 4, "April");
+ elm_spinner_special_value_add(sp, 5, "May");
+ elm_spinner_special_value_add(sp, 6, "June");
+ elm_spinner_special_value_add(sp, 7, "July");
+ elm_spinner_special_value_add(sp, 8, "August");
+ elm_spinner_special_value_add(sp, 9, "September");
+ elm_spinner_special_value_add(sp, 10, "October");
+ elm_spinner_special_value_add(sp, 11, "November");
+ elm_spinner_special_value_add(sp, 12, "December");
+ evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(bx, sp);
+ evas_object_show(sp);
+
evas_object_show(win);
}
#endif
diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in
index 12fea7b..cbb5568 100644
--- a/src/lib/Elementary.h.in
+++ b/src/lib/Elementary.h.in
@@ -1197,6 +1197,9 @@ extern "C" {
EAPI double elm_spinner_value_get(const Evas_Object *obj);
EAPI void elm_spinner_wrap_set(Evas_Object *obj, Eina_Bool wrap);
EAPI Eina_Bool elm_spinner_wrap_get(const Evas_Object *obj);
+ EAPI void elm_spinner_editable_set(Evas_Object *obj, Eina_Bool
editable);
+ EAPI Eina_Bool elm_spinner_editable_get(const Evas_Object *obj);
+ EAPI void elm_spinner_special_value_add(Evas_Object *obj, double
value, const char *label);
/* smart callbacks called:
* "changed" - when the spinner value changes
* "delay,changed" - when the spinner value changed, but a small time after
a change (use this if you only want to respond to a change once the spinner is
held still for a short while).
diff --git a/src/lib/elm_spinner.c b/src/lib/elm_spinner.c
index 65d50b2..6ca61b3 100644
--- a/src/lib/elm_spinner.c
+++ b/src/lib/elm_spinner.c
@@ -23,6 +23,7 @@
* expensive reactions to the value change.
*/
typedef struct _Widget_Data Widget_Data;
+typedef struct _Elm_Spinner_Special_Value Elm_Spinner_Special_Value;
struct _Widget_Data
{
@@ -31,9 +32,16 @@ struct _Widget_Data
double val, val_min, val_max, orig_val, step;
double drag_start_pos, spin_speed, interval;
Ecore_Timer *delay, *spin;
+ Eina_List *special_values;
Eina_Bool wrap : 1;
Eina_Bool entry_visible : 1;
Eina_Bool dragging : 1;
+ Eina_Bool editable : 1;
+};
+
+struct _Elm_Spinner_Special_Value {
+ double value;
+ const char *label;
};
static const char *widtype = NULL;
@@ -47,10 +55,17 @@ static Eina_Bool _value_set(Evas_Object *obj, double delta);
static void
_del_hook(Evas_Object *obj)
{
+ Elm_Spinner_Special_Value *sv;
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
if (wd->label) eina_stringshare_del(wd->label);
if (wd->delay) ecore_timer_del(wd->delay);
+ if (wd->special_values)
+ EINA_LIST_FREE(wd->special_values, sv)
+ {
+ eina_stringshare_del(sv->label);
+ free(sv);
+ }
free(wd);
}
@@ -135,13 +150,23 @@ _entry_show(Widget_Data *wd)
static void
_write_label(Evas_Object *obj)
{
+ Eina_List *l;
+ Elm_Spinner_Special_Value *sv;
Widget_Data *wd = elm_widget_data_get(obj);
char buf[1024];
if (!wd) return;
+ EINA_LIST_FOREACH(wd->special_values, l, sv)
+ if (sv->value == wd->val)
+ {
+ snprintf(buf, sizeof(buf), "%s", sv->label);
+ goto apply;
+ }
if (wd->label)
snprintf(buf, sizeof(buf), wd->label, wd->val);
else
snprintf(buf, sizeof(buf), "%.0f", wd->val);
+
+apply:
edje_object_part_text_set(wd->spinner, "elm.text", buf);
if (wd->entry_visible) _entry_show(wd);
}
@@ -295,6 +320,7 @@ _toggle_entry(void *data, Evas_Object *obj __UNUSED__,
const char *emission __UN
return;
}
if (elm_widget_disabled_get(data)) return;
+ if (!wd->editable) return;
if (wd->entry_visible) _apply_entry_value(data);
else
{
@@ -472,6 +498,7 @@ elm_spinner_add(Evas_Object *parent)
wd->wrap = 0;
wd->step = 1.0;
wd->entry_visible = 0;
+ wd->editable = EINA_TRUE;
wd->spinner = edje_object_add(e);
_elm_theme_set(wd->spinner, "spinner", "base", "default");
@@ -710,3 +737,62 @@ elm_spinner_wrap_get(const Evas_Object *obj)
if (!wd) return EINA_FALSE;
return wd->wrap;
}
+
+/**
+ * Set a special value to display in the place of the numerical one.
+ *
+ * @param obj The spinner object
+ * @param value The value to be replaced
+ * @param label The label to be used
+ *
+ * @ingroup Spinner
+ */
+EAPI void
+elm_spinner_special_value_add(Evas_Object *obj, double value, const char
*label)
+{
+ Elm_Spinner_Special_Value *sv;
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+
+ sv = calloc(1, sizeof(*sv));
+ if (!sv) return;
+ sv->value = value;
+ sv->label = eina_stringshare_add(label);
+
+ wd->special_values = eina_list_append(wd->special_values, sv);
+ _write_label(obj);
+}
+
+/**
+ * Set whether the spinner can be directly edited by the user or not.
+ * Default is editable.
+ *
+ * @param obj The spinner object
+ * @param editable Bool value of the edit option
+ * (EINA_FALSE = not editable, EINA_TRUE = editable)
+ */
+EAPI void
+elm_spinner_editable_set(Evas_Object *obj, Eina_Bool editable)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype);
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ wd->editable = editable;
+}
+
+/**
+ * Gets whether the spinner is editable.
+ *
+ * @param obj The spinner object
+ * @return Bool value of edit option
+ * (EINA_FALSE = not editable, EINA_TRUE = editable)
+ */
+EAPI Eina_Bool
+elm_spinner_editable_get(const Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return EINA_FALSE;
+ return wd->editable;
+}
--
1.7.0.5
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel