tizen 2.4 release
[framework/uifw/elementary.git] / src / modules / prefs / elm_spinner.c
1 #include "private.h"
2
3 static Elm_Prefs_Item_Type supported_types[] =
4 {
5    ELM_PREFS_TYPE_INT,
6    ELM_PREFS_TYPE_FLOAT,
7    ELM_PREFS_TYPE_UNKNOWN
8 };
9
10 static void
11 _item_changed_cb(void *data,
12                  Evas_Object *obj,
13                  void *event_info EINA_UNUSED)
14 {
15     Elm_Prefs_Item_Changed_Cb prefs_it_changed_cb = data;
16
17     prefs_it_changed_cb(obj);
18 }
19
20 static Evas_Object *
21 elm_prefs_spinner_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
22                       Evas_Object *prefs,
23                       const Elm_Prefs_Item_Type type,
24                       const Elm_Prefs_Item_Spec spec,
25                       Elm_Prefs_Item_Changed_Cb cb)
26 {
27    Evas_Object *obj = elm_spinner_add(prefs);
28
29    evas_object_data_set(obj, "prefs_type", (void *)type);
30
31    evas_object_smart_callback_add(obj, "changed", _item_changed_cb, cb);
32
33    if (type == ELM_PREFS_TYPE_INT)
34      {
35         elm_spinner_step_set(obj, 1.0);
36         elm_spinner_min_max_set(obj, spec.i.min, spec.i.max);
37         elm_spinner_value_set(obj, spec.i.def);
38      }
39    else if (type == ELM_PREFS_TYPE_FLOAT)
40      {
41         elm_spinner_label_format_set(obj, "%1.2f");
42         elm_spinner_step_set(obj, 0.1);
43         elm_spinner_min_max_set(obj, spec.f.min, spec.f.max);
44         elm_spinner_value_set(obj, spec.f.def);
45      }
46
47    return obj;
48 }
49
50 static Eina_Bool
51 elm_prefs_spinner_value_set(Evas_Object *obj,
52                             Eina_Value *value)
53 {
54    union
55    {
56       int   i;
57       float f;
58    } val;
59
60    Elm_Prefs_Item_Type pt =
61      (Elm_Prefs_Item_Type) evas_object_data_get(obj, "prefs_type");
62
63    const Eina_Value_Type *vt = eina_value_type_get(value);
64    if (!vt) return EINA_FALSE;
65
66    if ((pt == ELM_PREFS_TYPE_INT) && (vt == EINA_VALUE_TYPE_INT))
67      {
68         eina_value_get(value, &(val.i));
69         elm_spinner_value_set(obj, val.i);
70      }
71    else if ((pt == ELM_PREFS_TYPE_FLOAT) && (vt == EINA_VALUE_TYPE_FLOAT))
72      {
73         eina_value_get(value, &(val.f));
74         elm_spinner_value_set(obj, val.f);
75      }
76    else
77      return EINA_FALSE;
78
79    return EINA_TRUE;
80 }
81
82 static Eina_Bool
83 elm_prefs_spinner_value_get(Evas_Object *obj,
84                             Eina_Value *value)
85 {
86    union
87    {
88       int   i;
89       float f;
90    } val;
91
92    Elm_Prefs_Item_Type pt =
93      (Elm_Prefs_Item_Type) evas_object_data_get(obj, "prefs_type");
94
95    if (pt == ELM_PREFS_TYPE_INT)
96      {
97         val.i = elm_spinner_value_get(obj);
98
99         if (!eina_value_setup(value, EINA_VALUE_TYPE_INT)) return EINA_FALSE;
100         if (!eina_value_set(value, val.i)) return EINA_FALSE;
101      }
102    else if (pt == ELM_PREFS_TYPE_FLOAT)
103       {
104         val.f = elm_spinner_value_get(obj);
105
106         if (!eina_value_setup(value, EINA_VALUE_TYPE_FLOAT)) return EINA_FALSE;
107         if (!eina_value_set(value, val.f)) return EINA_FALSE;
108       }
109    else
110      return EINA_FALSE;
111
112    return EINA_TRUE;
113 }
114
115 PREFS_ITEM_WIDGET_ADD(spinner,
116                       supported_types,
117                       elm_prefs_spinner_value_set,
118                       elm_prefs_spinner_value_get,
119                       NULL,
120                       NULL,
121                       NULL,
122                       NULL,
123                       NULL,
124                       NULL);