update for beta release
[framework/uifw/e17.git] / src / bin / e_widget_slider.c
1 #include "e.h"
2
3 typedef struct _E_Widget_Data E_Widget_Data;
4 struct _E_Widget_Data
5 {
6    Evas_Object *o_widget, *o_slider;
7    double      *dval;
8    int         *ival;
9 };
10
11 static void _e_wid_del_hook(Evas_Object *obj);
12 static void _e_wid_focus_hook(Evas_Object *obj);
13 static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
14 static void _e_wid_cb_changed(void *data, Evas_Object *obj, void *event_info);
15 static void _e_wid_disable_hook(Evas_Object *obj);
16
17 /* externally accessible functions */
18 EAPI Evas_Object *
19 e_widget_slider_add(Evas *evas, int horiz, int rev, const char *fmt, double min, double max, double step, int count, double *dval, int *ival, Evas_Coord size)
20 {
21    Evas_Object *obj, *o;
22    E_Widget_Data *wd;
23    Evas_Coord mw, mh;
24    
25    obj = e_widget_add(evas);
26    
27    e_widget_del_hook_set(obj, _e_wid_del_hook);
28    e_widget_focus_hook_set(obj, _e_wid_focus_hook);
29    e_widget_disable_hook_set(obj, _e_wid_disable_hook);
30    wd = calloc(1, sizeof(E_Widget_Data));
31    e_widget_data_set(obj, wd);
32    wd->o_widget = obj;
33
34    o = e_slider_add(evas);
35    wd->o_slider = o;
36    evas_object_show(o);
37    e_widget_sub_object_add(obj, o);
38    e_widget_resize_object_set(obj, o);
39    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
40    
41    e_slider_orientation_set(o, horiz);
42    e_slider_direction_set(o, rev);
43    e_slider_value_range_set(o, min, max);
44    e_slider_value_format_display_set(o, fmt);
45    e_slider_value_step_count_set(o, count);
46    e_slider_value_step_size_set(o, step);
47    if (dval) e_slider_value_set(o, *dval);
48    else if (ival) e_slider_value_set(o, *ival);
49    
50    e_slider_size_min_get(o, &mw, &mh);
51    if (horiz)
52      e_widget_size_min_set(obj, mw + size, mh);
53    else
54      e_widget_size_min_set(obj, mw, mh + size);
55    
56    wd->dval = dval;
57    wd->ival = ival;
58    evas_object_smart_callback_add(o, "changed", _e_wid_cb_changed, wd);
59    
60    return obj;
61 }
62
63 /**  
64  * Set the double value for the slider. This will also move the slider to
65  * the correct position and update the text indecator. Will not do anything
66  * if the slider was not created with a double value.
67  *  
68  * @param slider pointer to the slider to be modified
69  * @param dval the double value to set the slider to
70  * @return 1 if value set, return 0 if value not set
71  */
72 EAPI int
73 e_widget_slider_value_double_set(Evas_Object *slider, double dval)
74 {
75    E_Widget_Data *wd;   
76
77    wd = e_widget_data_get(slider);
78    if (!wd->dval) return 0;
79    *(wd->dval) = dval;
80    e_slider_value_set(wd->o_slider, dval);
81    return 1;   
82 }
83
84 /**  
85  * Set the integer value for the slider. This will also move the slider to
86  * the correct position and update the text indecator. Will not do anything
87  * if the slider was not created with an integer value. 
88  *  
89  * @param slider pointer to the slider to be modified
90  * @param int the integer value to set the slider to
91  * @return 1 if value set, return 0 if value not set
92  */
93 EAPI int
94 e_widget_slider_value_int_set(Evas_Object *slider, int ival)
95 {
96    E_Widget_Data *wd;   
97
98    wd = e_widget_data_get(slider);
99    if (!wd->ival) return 0;
100    *(wd->ival) = ival;
101    e_slider_value_set(wd->o_slider, ival);
102    return 1; 
103 }
104
105 /**  
106  * Get the double value for the slider. The value of dval is undefined
107  * if the slider was not created with a double value.
108  *  
109  * @param slider pointer to the slider to be queried
110  * @param dval the pointer to the double value to be set with the value of the slider
111  * @return 1 if value returned, return 0 if value not returned
112  */
113 EAPI int
114 e_widget_slider_value_double_get(Evas_Object *slider, double *dval)
115 {
116    E_Widget_Data *wd;   
117
118    wd = e_widget_data_get(slider);
119    if (!wd->dval) return 0;
120    if (!dval) return 0;
121
122    *dval = *(wd->dval);
123    return 1;   
124 }
125
126 /**  
127  * Get the integer value for the slider. The value of ival is undefined
128  * if the slider was not created with an integer value.
129  *  
130  * @param slider pointer to the slider to be queried
131  * @param ival the pointer to the integer value to be set with the value of the slider
132  * @return 1 if value returned, return 0 if value not returned
133  */
134 EAPI int
135 e_widget_slider_value_int_get(Evas_Object *slider, int *ival)
136 {
137    E_Widget_Data *wd;   
138
139    wd = e_widget_data_get(slider);
140    if (!wd->ival) return 0;
141    if (!ival) return 0;
142    
143    *ival = *(wd->ival);
144    return 1; 
145 }
146
147 EAPI void 
148 e_widget_slider_value_format_display_set(Evas_Object *slider, const char *format) 
149 {
150    E_Widget_Data *wd;
151
152    wd = e_widget_data_get(slider);
153    e_slider_value_format_display_set(wd->o_slider, format);
154 }
155
156 EAPI void 
157 e_widget_slider_value_range_set(Evas_Object *slider, double min, double max) 
158 {
159    E_Widget_Data *wd;
160
161    wd = e_widget_data_get(slider);
162    e_slider_value_range_set(wd->o_slider, min, max);
163 }
164
165 EAPI void 
166 e_widget_slider_value_step_size_set(Evas_Object *slider, double step_size) 
167 {
168    E_Widget_Data *wd;
169
170    wd = e_widget_data_get(slider);
171    e_slider_value_step_size_set(wd->o_slider, step_size);
172 }
173
174 EAPI void
175 e_widget_slider_special_value_add(Evas_Object *obj, double value, double error, const char *label)
176 {
177    E_Widget_Data *wd;
178
179    wd = e_widget_data_get(obj);
180    e_slider_special_value_add(wd->o_slider, value, error, label);
181 }
182
183 /* Private functions */
184 static void
185 _e_wid_del_hook(Evas_Object *obj)
186 {
187    E_Widget_Data *wd;
188    
189    wd = e_widget_data_get(obj);
190    free(wd);
191 }
192
193 static void
194 _e_wid_focus_hook(Evas_Object *obj)
195 {
196    E_Widget_Data *wd;
197    
198    wd = e_widget_data_get(obj);
199    if (e_widget_focus_get(obj))
200      {
201         edje_object_signal_emit(e_slider_edje_object_get(wd->o_slider), "e,state,focused", "e");
202         evas_object_focus_set(wd->o_slider, 1);
203      }
204    else
205      {
206         edje_object_signal_emit(e_slider_edje_object_get(wd->o_slider), "e,state,unfocused", "e");
207         evas_object_focus_set(wd->o_slider, 0);
208      }
209 }
210
211 static void
212 _e_wid_focus_steal(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
213 {
214    e_widget_focus_steal(data);
215 }
216
217 static void
218 _e_wid_cb_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
219 {
220    E_Widget_Data *wd;
221    
222    wd = data;
223    if (wd->dval) *(wd->dval) = e_slider_value_get(wd->o_slider);
224    else if (wd->ival) *(wd->ival) = e_slider_value_get(wd->o_slider);
225    e_widget_change(wd->o_widget);
226    evas_object_smart_callback_call(wd->o_widget, "changed", NULL);
227 }
228
229 static void
230 _e_wid_disable_hook(Evas_Object *obj)
231 {
232    E_Widget_Data *wd;
233    
234    wd = e_widget_data_get(obj);
235    if (e_widget_disabled_get(obj))
236      edje_object_signal_emit(e_slider_edje_object_get(wd->o_slider),
237                              "e,state,disabled", "e");
238    else
239      edje_object_signal_emit(e_slider_edje_object_get(wd->o_slider),
240                              "e,state,enabled", "e");
241 }