The following patch add the capability to replace numerical values by strings in elm_spinner as already is done by e_slider.

--
Rafael Fonseca
ProFUSION embedded systems
http://www.profusion.mobi
>From d88c8413fec225f703d7a713fcdd3f12fe79d87b 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  |   21 +++++++++++++++++++
 src/lib/Elementary.h.in |    1 +
 src/lib/elm_spinner.c   |   50 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/src/bin/test_spinner.c b/src/bin/test_spinner.c
index 5d421a0..7f73099 100644
--- a/src/bin/test_spinner.c
+++ b/src/bin/test_spinner.c
@@ -59,6 +59,27 @@ 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_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..d126b46 100644
--- a/src/lib/Elementary.h.in
+++ b/src/lib/Elementary.h.in
@@ -1197,6 +1197,7 @@ 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_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..bef47bb 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,11 +32,17 @@ 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;
 };
 
+struct _Elm_Spinner_Special_Value {
+     double value;
+     const char *label;
+};
+
 static const char *widtype = NULL;
 static void _del_hook(Evas_Object *obj);
 static void _disable_hook(Evas_Object *obj);
@@ -47,10 +54,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 +149,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);
 }
@@ -710,3 +734,29 @@ 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);
+}
-- 
1.7.0.5

------------------------------------------------------------------------------
Download Intel&#174; 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

Reply via email to