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