1 #define _XOPEN_SOURCE  600
2 #include "e.h"
3 
4 #define SMART_NAME     "e_slider"
5 #define API_ENTRY      E_Smart_Data * sd; sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME)))
6 #define INTERNAL_ENTRY E_Smart_Data * sd; sd = evas_object_smart_data_get(obj); if (!sd) return;
7 typedef struct _E_Smart_Data           E_Smart_Data;
8 
9 typedef struct _E_Slider_Special_Value E_Slider_Special_Value;
10 
11 struct _E_Smart_Data
12 {
13    Evas_Coord   x, y, w, h;
14 
15    Evas_Object *smart_obj;
16    Evas_Object *edje_obj;
17    Evas_Object *event;
18    double       val, val_min, val_max, val_range, step_size;
19    int          reversed, step_count, horizontal;
20    int          direction;
21    int          changing;
22    const char  *format;
23    Evas_Coord   minw, minh;
24    Ecore_Timer *set_timer;
25    Eina_List   *special_values;
26    Eina_Bool    disabled E_BITFIELD;
27 };
28 
29 struct _E_Slider_Special_Value
30 {
31    double      value;
32    double      error;
33    const char *label;
34 };
35 
36 /* local subsystem functions */
37 static Eina_Bool _e_smart_set_timer(void *data);
38 static void      _e_smart_value_update(E_Smart_Data *sd);
39 static void      _e_smart_value_update_now(E_Smart_Data *sd);
40 static void      _e_smart_value_fetch(E_Smart_Data *sd);
41 static void      _e_smart_value_limit(E_Smart_Data *sd);
42 static void      _e_smart_format_update(E_Smart_Data *sd);
43 static void      _e_smart_signal_cb_drag(void *data, Evas_Object *obj, const char *emission, const char *source);
44 static void      _e_smart_signal_cb_drag_start(void *data, Evas_Object *obj, const char *emission, const char *source);
45 static void      _e_smart_signal_cb_drag_stop(void *data, Evas_Object *obj, const char *emission, const char *source);
46 static void      _e_smart_event_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
47 static void      _e_smart_event_mouse_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info);
48 static void      _e_smart_reconfigure(E_Smart_Data *sd);
49 static void      _e_smart_add(Evas_Object *obj);
50 static void      _e_smart_del(Evas_Object *obj);
51 static void      _e_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
52 static void      _e_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
53 static void      _e_smart_show(Evas_Object *obj);
54 static void      _e_smart_hide(Evas_Object *obj);
55 static void      _e_smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
56 static void      _e_smart_clip_set(Evas_Object *obj, Evas_Object *clip);
57 static void      _e_smart_clip_unset(Evas_Object *obj);
58 static void      _e_smart_init(void);
59 
60 /* local subsystem globals */
61 static Evas_Smart *_e_smart = NULL;
62 
63 /* externally accessible functions */
64 E_API Evas_Object *
e_slider_add(Evas * evas)65 e_slider_add(Evas *evas)
66 {
67    _e_smart_init();
68    return evas_object_smart_add(evas, _e_smart);
69 }
70 
71 E_API void
e_slider_orientation_set(Evas_Object * obj,int horizontal)72 e_slider_orientation_set(Evas_Object *obj, int horizontal)
73 {
74    API_ENTRY return;
75    if (sd->horizontal == horizontal) return;
76    sd->horizontal = horizontal;
77    if (sd->horizontal)
78      e_theme_edje_object_set(sd->edje_obj, "base/theme/widgets",
79                              "e/widgets/slider_horizontal");
80    else
81      e_theme_edje_object_set(sd->edje_obj, "base/theme/widgets",
82                              "e/widgets/slider_vertical");
83    edje_object_size_min_calc(sd->edje_obj, &(sd->minw), &(sd->minh));
84    _e_smart_value_update(sd);
85 }
86 
87 E_API int
e_slider_orientation_get(Evas_Object * obj)88 e_slider_orientation_get(Evas_Object *obj)
89 {
90    API_ENTRY return 0;
91    return sd->horizontal;
92 }
93 
94 E_API void
e_slider_value_set(Evas_Object * obj,double val)95 e_slider_value_set(Evas_Object *obj, double val)
96 {
97    API_ENTRY return;
98    sd->val = val;
99    _e_smart_value_update_now(sd);
100 }
101 
102 E_API double
e_slider_value_get(Evas_Object * obj)103 e_slider_value_get(Evas_Object *obj)
104 {
105    API_ENTRY return 0.0;
106    return sd->val;
107 }
108 
109 E_API void
e_slider_value_range_set(Evas_Object * obj,double min,double max)110 e_slider_value_range_set(Evas_Object *obj, double min, double max)
111 {
112    API_ENTRY return;
113    sd->val_min = min;
114    sd->val_max = max;
115    if (sd->val_max < sd->val_min) sd->val_min = sd->val_max;
116    sd->val_range = sd->val_max - sd->val_min;
117    sd->direction = 0;
118    _e_smart_value_limit(sd);
119    _e_smart_value_update_now(sd);
120 }
121 
122 E_API void
e_slider_value_range_get(Evas_Object * obj,double * min,double * max)123 e_slider_value_range_get(Evas_Object *obj, double *min, double *max)
124 {
125    API_ENTRY return;
126    if (min) *min = sd->val_min;
127    if (max) *max = sd->val_max;
128 }
129 
130 E_API void
e_slider_value_step_size_set(Evas_Object * obj,double step_size)131 e_slider_value_step_size_set(Evas_Object *obj, double step_size)
132 {
133    double step;
134 
135    API_ENTRY return;
136    if (step_size < 0.0) step_size = 0.0;
137    sd->step_size = step_size;
138    step = 0.0;
139    if (sd->val_range > 0.0)
140      step = step_size / sd->val_range;
141    edje_object_part_drag_step_set
142      (sd->edje_obj, "e.dragable.slider", step, step);
143    sd->direction = 0;
144    _e_smart_value_limit(sd);
145    _e_smart_value_update_now(sd);
146 }
147 
148 E_API double
e_slider_value_step_size_get(Evas_Object * obj)149 e_slider_value_step_size_get(Evas_Object *obj)
150 {
151    API_ENTRY return 0.0;
152    return sd->step_size;
153 }
154 
155 E_API void
e_slider_value_step_count_set(Evas_Object * obj,int step_count)156 e_slider_value_step_count_set(Evas_Object *obj, int step_count)
157 {
158    API_ENTRY return;
159    sd->step_count = step_count;
160    sd->direction = 0;
161    _e_smart_value_limit(sd);
162    _e_smart_value_update_now(sd);
163 }
164 
165 E_API int
e_slider_value_step_count_get(Evas_Object * obj)166 e_slider_value_step_count_get(Evas_Object *obj)
167 {
168    API_ENTRY return 0;
169    return sd->step_count;
170 }
171 
172 E_API void
e_slider_value_format_display_set(Evas_Object * obj,const char * format)173 e_slider_value_format_display_set(Evas_Object *obj, const char *format)
174 {
175    int changed = 0;
176 
177    API_ENTRY return;
178    if (((sd->format) && (!format)) || ((!sd->format) && (format))) changed = 1;
179    if (sd->format) eina_stringshare_del(sd->format);
180    sd->format = NULL;
181    if (format) sd->format = eina_stringshare_add(format);
182    if (changed)
183      {
184         if (sd->format)
185           edje_object_signal_emit(sd->edje_obj, "e,action,show,label", "e");
186         else
187           edje_object_signal_emit(sd->edje_obj, "e,action,hide,label", "e");
188      }
189    _e_smart_format_update(sd);
190    edje_object_message_signal_process(sd->edje_obj);
191    edje_object_size_min_calc(sd->edje_obj, &(sd->minw), &(sd->minh));
192 }
193 
194 E_API const char *
e_slider_value_format_display_get(Evas_Object * obj)195 e_slider_value_format_display_get(Evas_Object *obj)
196 {
197    API_ENTRY return NULL;
198    return sd->format;
199 }
200 
201 E_API void
e_slider_direction_set(Evas_Object * obj,int reversed)202 e_slider_direction_set(Evas_Object *obj, int reversed)
203 {
204    API_ENTRY return;
205    sd->reversed = reversed;
206    _e_smart_value_update_now(sd);
207 }
208 
209 E_API void
e_slider_disabled_set(Evas_Object * obj,Eina_Bool disable)210 e_slider_disabled_set(Evas_Object *obj, Eina_Bool disable)
211 {
212    API_ENTRY return;
213 
214    if (sd->disabled == disable) return;
215    sd->disabled = disable;
216 
217    if (disable)
218      edje_object_signal_emit(sd->edje_obj, "e,state,disabled", "e");
219    else
220      edje_object_signal_emit(sd->edje_obj, "e,state,enabled", "e");
221 }
222 
223 E_API int
e_slider_direction_get(Evas_Object * obj)224 e_slider_direction_get(Evas_Object *obj)
225 {
226    API_ENTRY return 0;
227    return sd->reversed;
228 }
229 
230 E_API void
e_slider_size_min_get(Evas_Object * obj,Evas_Coord * minw,Evas_Coord * minh)231 e_slider_size_min_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
232 {
233    API_ENTRY return;
234    if (minw) *minw = sd->minw;
235    if (minh) *minh = sd->minh;
236 }
237 
238 E_API Evas_Object *
e_slider_edje_object_get(Evas_Object * obj)239 e_slider_edje_object_get(Evas_Object *obj)
240 {
241    API_ENTRY return NULL;
242    return sd->edje_obj;
243 }
244 
245 E_API void
e_slider_special_value_add(Evas_Object * obj,double value,double error,const char * label)246 e_slider_special_value_add(Evas_Object *obj, double value, double error, const char *label)
247 {
248    E_Slider_Special_Value *sv;
249    API_ENTRY return;
250 
251    sv = malloc(sizeof(E_Slider_Special_Value));
252    if (!sv) return;
253    sv->value = value;
254    sv->error = error;
255    sv->label = eina_stringshare_add(label);
256 
257    sd->special_values = eina_list_append(sd->special_values, sv);
258    _e_smart_format_update(sd);
259 }
260 
261 /* local subsystem functions */
262 static Eina_Bool
_e_smart_set_timer(void * data)263 _e_smart_set_timer(void *data)
264 {
265    E_Smart_Data *sd = data;
266    double pos = 0.0;
267 
268    if (sd->val_range > 0.0) pos = (sd->val - sd->val_min) / sd->val_range;
269    if (pos < 0.0) pos = 0.0;
270    else if (pos > 1.0)
271      pos = 1.0;
272    if (sd->reversed) pos = 1.0 - pos;
273    sd->changing++;
274    if (sd->set_timer) ecore_timer_del(sd->set_timer);
275    sd->set_timer = NULL;
276    edje_object_part_drag_value_set(sd->edje_obj, "e.dragable.slider", pos, pos);
277    edje_object_message_signal_process(sd->edje_obj);
278    sd->changing--;
279    return ECORE_CALLBACK_CANCEL;
280 }
281 
282 static void
_e_smart_value_update(E_Smart_Data * sd)283 _e_smart_value_update(E_Smart_Data *sd)
284 {
285    if (sd->set_timer) ecore_timer_del(sd->set_timer);
286    sd->set_timer = ecore_timer_loop_add(0.05, _e_smart_set_timer, sd);
287 }
288 
289 static void
_e_smart_value_update_now(E_Smart_Data * sd)290 _e_smart_value_update_now(E_Smart_Data *sd)
291 {
292    _e_smart_set_timer(sd);
293 }
294 
295 static void
_e_smart_value_fetch(E_Smart_Data * sd)296 _e_smart_value_fetch(E_Smart_Data *sd)
297 {
298    double posx = 0.0, posy = 0.0, pos = 0.0;
299 
300    edje_object_part_drag_value_get
301      (sd->edje_obj, "e.dragable.slider", &posx, &posy);
302    if (sd->horizontal) pos = posx;
303    else pos = posy;
304    sd->val = (pos * sd->val_range) + sd->val_min;
305 }
306 
307 static void
_e_smart_value_limit(E_Smart_Data * sd)308 _e_smart_value_limit(E_Smart_Data *sd)
309 {
310    if (sd->val < sd->val_min) sd->val = sd->val_min;
311    if (sd->val > sd->val_max) sd->val = sd->val_max;
312    if (sd->val_range > 0.0)
313      {
314         if (sd->step_count > 0)
315           {
316              double p, s;
317 
318              s = sd->val_range / sd->step_count;
319              p = sd->val / s;
320              if (sd->direction == 1)
321                p = ceil(p);
322              else if (sd->direction == -1)
323                p = floor(p);
324              else
325                p = round(p);
326              sd->val = p * s;
327           }
328         else if (sd->step_size > 0.0)
329           {
330              double p;
331 
332              p = sd->val / sd->step_size;
333              if (sd->direction == 1)
334                p = ceil(p);
335              else if (sd->direction == -1)
336                p = floor(p);
337              else
338                p = round(p);
339              sd->val = p * sd->step_size;
340           }
341      }
342    sd->direction = 0;
343 }
344 
345 static void
_e_smart_format_update(E_Smart_Data * sd)346 _e_smart_format_update(E_Smart_Data *sd)
347 {
348    const E_Slider_Special_Value *sv;
349    const Eina_List *l;
350 
351    EINA_LIST_FOREACH(sd->special_values, l, sv)
352      if (fabs(sd->val - sv->value) <= sv->error)
353        {
354           edje_object_part_text_set(sd->edje_obj, "e.text.label", sv->label);
355           return;
356        }
357 
358    if (sd->format)
359      {
360         char buf[256];
361 DISABLE_WARNING(format-nonliteral, format-nonliteral, format-nonliteral)
362         snprintf(buf, sizeof(buf), sd->format, sd->val);
363 ENABLE_WARNING(format-nonliteral, format-nonliteral, format-nonliteral)
364         edje_object_part_text_set(sd->edje_obj, "e.text.label", buf);
365      }
366 }
367 
368 static void
_e_smart_signal_cb_drag(void * data,Evas_Object * obj EINA_UNUSED,const char * emission EINA_UNUSED,const char * source EINA_UNUSED)369 _e_smart_signal_cb_drag(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
370 {
371    E_Smart_Data *sd = data;
372    double pval = sd->val;
373 
374    _e_smart_value_fetch(sd);
375    _e_smart_value_limit(sd);
376    _e_smart_format_update(sd);
377    if (sd->changing) return;
378    if (!EINA_DBL_EQ(sd->val, pval))
379      evas_object_smart_callback_call(sd->smart_obj, "changed", NULL);
380 }
381 
382 static void
_e_smart_signal_cb_drag_start(void * data,Evas_Object * obj EINA_UNUSED,const char * emission EINA_UNUSED,const char * source EINA_UNUSED)383 _e_smart_signal_cb_drag_start(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
384 {
385    E_Smart_Data *sd = data;
386    double pval = sd->val;
387 
388    _e_smart_value_fetch(sd);
389    _e_smart_value_limit(sd);
390    _e_smart_format_update(sd);
391    if (sd->changing) return;
392    if (!EINA_DBL_EQ(sd->val, pval))
393      evas_object_smart_callback_call(sd->smart_obj, "changed", NULL);
394 }
395 
396 static void
_e_smart_signal_cb_drag_stop(void * data,Evas_Object * obj EINA_UNUSED,const char * emission EINA_UNUSED,const char * source EINA_UNUSED)397 _e_smart_signal_cb_drag_stop(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
398 {
399    E_Smart_Data *sd = data;
400    double pval = sd->val;
401 
402    _e_smart_value_fetch(sd);
403    _e_smart_value_limit(sd);
404    _e_smart_format_update(sd);
405    _e_smart_value_update(sd);
406    if (sd->changing) return;
407    if (!EINA_DBL_EQ(sd->val, pval))
408      evas_object_smart_callback_call(sd->smart_obj, "changed", NULL);
409 }
410 
411 static void
_e_smart_signal_cb_wheel_up(void * data,Evas_Object * obj EINA_UNUSED,const char * emission EINA_UNUSED,const char * source EINA_UNUSED)412 _e_smart_signal_cb_wheel_up(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
413 {
414    E_Smart_Data *sd = data;
415 
416    if (sd->disabled) return;
417    edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", -0.05, -0.05);
418    sd->direction = -1;
419 }
420 
421 static void
_e_smart_signal_cb_wheel_down(void * data,Evas_Object * obj EINA_UNUSED,const char * emission EINA_UNUSED,const char * source EINA_UNUSED)422 _e_smart_signal_cb_wheel_down(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
423 {
424    E_Smart_Data *sd = data;
425 
426    if (sd->disabled) return;
427    edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", 0.05, 0.05);
428    sd->direction = 1;
429 }
430 
431 static void
_e_smart_event_key_down(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)432 _e_smart_event_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
433 {
434    Evas_Event_Key_Down *ev = event_info;
435    E_Smart_Data *sd = data;
436 
437    if (sd->disabled) return;
438    if ((!strcmp(ev->key, "Down")) ||
439        (!strcmp(ev->key, "KP_Down")) ||
440        (!strcmp(ev->key, "Left")) ||
441        (!strcmp(ev->key, "KP_Left")))
442      {
443         if (sd->step_count > 0)
444           {
445              double s = sd->val_range / sd->step_count;
446              edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", -s, -s);
447           }
448         else
449           edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", -1, -1);
450         sd->direction = -1;
451      }
452    else if ((!strcmp(ev->key, "Up")) ||
453             (!strcmp(ev->key, "KP_Up")) ||
454             (!strcmp(ev->key, "Right")) ||
455             (!strcmp(ev->key, "KP_Right")))
456      {
457         if (sd->step_count > 0)
458           {
459              double s = sd->val_range / sd->step_count;
460              edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", s, s);
461           }
462         else
463           edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", 1, 1);
464         sd->direction = 1;
465      }
466    else if ((!strcmp(ev->key, "Home")) ||
467             (!strcmp(ev->key, "KP_Home")))
468      {
469         edje_object_part_drag_value_set(sd->edje_obj, "e.dragable.slider", 0., 0.);
470         sd->direction = 0;
471      }
472    else if ((!strcmp(ev->key, "End")) ||
473             (!strcmp(ev->key, "KP_End")))
474      {
475         edje_object_part_drag_value_set(sd->edje_obj, "e.dragable.slider", 1., 1.);
476         sd->direction = 0;
477      }
478 }
479 
480 static void
_e_smart_event_mouse_down(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)481 _e_smart_event_mouse_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
482 {
483    Evas_Event_Mouse_Down *ev = event_info;
484    Evas_Coord x, y, w, h;
485    E_Smart_Data *sd = data;
486    double pos;
487    static int in_md = 0;
488 
489    if (sd->disabled) return;
490    if (in_md > 0) return;
491    in_md++;
492    evas_object_geometry_get(sd->event, &x, &y, &w, &h);
493    if (sd->horizontal)
494      {
495         pos = ((double)ev->output.x - (double)x) / (double)w;
496         if (pos > 1.0) pos = 1.0;
497         if (pos < 0.0) pos = 0.0;
498         if (sd->reversed)
499           pos = 1.0 - pos;
500      }
501    else
502      {
503         pos = (((double)ev->output.y - (double)y) / (double)h);
504         if (pos > 1.0) pos = 1.0;
505         if (pos < 0.0) pos = 0.0;
506         if (!sd->reversed)
507           pos = 1.0 - pos;
508      }
509 
510    edje_object_part_drag_value_set(sd->edje_obj, "e.dragable.slider", pos, pos);
511    edje_object_message_signal_process(sd->edje_obj); /* really needed or go in infinite loop */
512    evas_event_feed_mouse_cancel(e, 0, NULL);
513    evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, ev->timestamp, NULL);
514    in_md--;
515 }
516 
517 static void
_e_smart_reconfigure(E_Smart_Data * sd)518 _e_smart_reconfigure(E_Smart_Data *sd)
519 {
520    evas_object_move(sd->edje_obj, sd->x, sd->y);
521    evas_object_resize(sd->edje_obj, sd->w, sd->h);
522 }
523 
524 static void
_e_smart_add(Evas_Object * obj)525 _e_smart_add(Evas_Object *obj)
526 {
527    E_Smart_Data *sd;
528 
529    sd = calloc(1, sizeof(E_Smart_Data));
530    if (!sd) return;
531    evas_object_smart_data_set(obj, sd);
532 
533    sd->smart_obj = obj;
534    sd->x = 0;
535    sd->y = 0;
536    sd->w = 0;
537    sd->h = 0;
538 
539    sd->val = 0.0;
540    sd->val_min = 0.0;
541    sd->val_max = 1.0;
542    sd->val_range = 1.0;
543    sd->step_size = 0.01;
544    sd->reversed = 0;
545    sd->step_count = 0;
546    sd->horizontal = 0;
547    sd->format = NULL;
548    sd->direction = 0;
549 
550    sd->edje_obj = edje_object_add(evas_object_evas_get(obj));
551    e_theme_edje_object_set(sd->edje_obj, "base/theme/widgets",
552                            "e/widgets/slider_vertical");
553    edje_object_size_min_calc(sd->edje_obj, &(sd->minw), &(sd->minh));
554    evas_object_smart_member_add(sd->edje_obj, obj);
555 
556    sd->event = evas_object_rectangle_add(evas_object_evas_get(obj));
557    evas_object_color_set(sd->event, 0, 0, 0, 0);
558    evas_object_pass_events_set(sd->event, EINA_TRUE);
559    edje_object_part_swallow(sd->edje_obj, "e.swallow.bar", sd->event);
560    evas_object_smart_member_add(sd->event, sd->edje_obj);
561 
562    edje_object_signal_callback_add(sd->edje_obj, "drag", "*", _e_smart_signal_cb_drag, sd);
563    edje_object_signal_callback_add(sd->edje_obj, "drag,start", "*", _e_smart_signal_cb_drag_start, sd);
564    edje_object_signal_callback_add(sd->edje_obj, "drag,stop", "*", _e_smart_signal_cb_drag_stop, sd);
565    edje_object_signal_callback_add(sd->edje_obj, "drag,step", "*", _e_smart_signal_cb_drag_stop, sd);
566    edje_object_signal_callback_add(sd->edje_obj, "drag,set", "*", _e_smart_signal_cb_drag_stop, sd);
567    edje_object_signal_callback_add(sd->edje_obj, "mouse,wheel,0,1", "*", _e_smart_signal_cb_wheel_up, sd);
568    edje_object_signal_callback_add(sd->edje_obj, "mouse,wheel,0,-1", "*", _e_smart_signal_cb_wheel_down, sd);
569 
570    evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, _e_smart_event_key_down, sd);
571    evas_object_event_callback_add(sd->event, EVAS_CALLBACK_MOUSE_DOWN, _e_smart_event_mouse_down, sd);
572 }
573 
574 static void
_e_smart_del(Evas_Object * obj)575 _e_smart_del(Evas_Object *obj)
576 {
577    E_Slider_Special_Value *sv;
578 
579    INTERNAL_ENTRY;
580    evas_object_del(sd->event);
581    evas_object_del(sd->edje_obj);
582    if (sd->format) eina_stringshare_del(sd->format);
583    if (sd->set_timer) ecore_timer_del(sd->set_timer);
584    EINA_LIST_FREE(sd->special_values, sv)
585      {
586         eina_stringshare_del(sv->label);
587         free(sv);
588      }
589    free(sd);
590 }
591 
592 static void
_e_smart_move(Evas_Object * obj,Evas_Coord x,Evas_Coord y)593 _e_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
594 {
595    INTERNAL_ENTRY;
596    if ((sd->x == x) && (sd->y == y)) return;
597    sd->x = x;
598    sd->y = y;
599    _e_smart_reconfigure(sd);
600 }
601 
602 static void
_e_smart_resize(Evas_Object * obj,Evas_Coord w,Evas_Coord h)603 _e_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
604 {
605    INTERNAL_ENTRY;
606    if ((sd->w == w) && (sd->h == h)) return;
607    sd->w = w;
608    sd->h = h;
609    _e_smart_reconfigure(sd);
610 }
611 
612 static void
_e_smart_show(Evas_Object * obj)613 _e_smart_show(Evas_Object *obj)
614 {
615    INTERNAL_ENTRY;
616    evas_object_show(sd->edje_obj);
617 }
618 
619 static void
_e_smart_hide(Evas_Object * obj)620 _e_smart_hide(Evas_Object *obj)
621 {
622    INTERNAL_ENTRY;
623    evas_object_hide(sd->edje_obj);
624 }
625 
626 static void
_e_smart_color_set(Evas_Object * obj,int r,int g,int b,int a)627 _e_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
628 {
629    INTERNAL_ENTRY;
630    evas_object_color_set(sd->edje_obj, r, g, b, a);
631 }
632 
633 static void
_e_smart_clip_set(Evas_Object * obj,Evas_Object * clip)634 _e_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
635 {
636    INTERNAL_ENTRY;
637    evas_object_clip_set(sd->edje_obj, clip);
638 }
639 
640 static void
_e_smart_clip_unset(Evas_Object * obj)641 _e_smart_clip_unset(Evas_Object *obj)
642 {
643    INTERNAL_ENTRY;
644    evas_object_clip_unset(sd->edje_obj);
645 }
646 
647 /* never need to touch this */
648 
649 static void
_e_smart_init(void)650 _e_smart_init(void)
651 {
652    if (_e_smart) return;
653    {
654       static Evas_Smart_Class sc = EVAS_SMART_CLASS_INIT_NAME_VERSION(SMART_NAME);
655       if (!sc.add)
656         {
657            sc.add = _e_smart_add;
658            sc.del = _e_smart_del;
659            sc.move = _e_smart_move;
660            sc.resize = _e_smart_resize;
661            sc.show = _e_smart_show;
662            sc.hide = _e_smart_hide;
663            sc.color_set = _e_smart_color_set;
664            sc.clip_set = _e_smart_clip_set;
665            sc.clip_unset = _e_smart_clip_unset;
666         }
667       _e_smart = evas_smart_class_new(&sc);
668    }
669 }
670 
671