b6af4cfd720621d7709eb79c028638ee4c10ffb5
[platform/upstream/elementary.git] / src / lib / tizen_vector.c
1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4
5 #include <Elementary.h>
6 #include "elm_priv.h"
7 #include "elm_widget_radio.h"
8
9 #define EFL_BETA_API_SUPPORT 1
10
11 #ifdef TIZEN_VECTOR_UX
12
13 static const char *vg_key = "_tizen_vg";
14
15 static double
16 ELM_VG_SCALE_SIZE(Evas_Object* obj, double x)
17 {
18    Evas_Object *edje = elm_layout_edje_get(obj);
19
20    return ((x) * elm_config_scale_get() / edje_object_base_scale_get(edje) * elm_widget_scale_get(obj));
21 }
22 /////////////////////////////////////////////////////////////////////////
23 /* Radio */
24 /////////////////////////////////////////////////////////////////////////
25 typedef struct vg_radio_s
26 {
27    Evas_Object *vg[3];       //0: bg, 1: outline, 2: icon
28    Efl_VG_Shape *shape[3];   //0: bg, 1: outline, 2: icon
29    Elm_Transit *transit;
30    Evas_Object *obj;
31    Eina_Bool init : 1;
32 } vg_radio;
33
34 static void
35 radio_init(vg_radio *vd)
36 {
37    if (vd->init) return;
38    vd->init = EINA_TRUE;
39
40    // bg
41    vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
42    evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
43
44    //Outline Shape
45    vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
46    evas_vg_shape_stroke_color_set(vd->shape[1], 255, 255, 255, 255);
47
48    //Iconic Circle (Center Point)
49    vd->shape[2] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
50    evas_vg_node_color_set(vd->shape[2], 255, 255, 255, 255);
51
52 }
53
54 static void
55 _radio_bg_update(vg_radio *vd)
56 {
57    Evas_Coord w, h;
58    ELM_RADIO_DATA_GET(vd->obj, rd);
59    Eina_Bool on_case = rd->state;
60    Efl_VG * shape = vd->shape[0];
61    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
62    evas_vg_shape_reset(shape);
63    double r = w/2;
64    if (on_case)
65      r -= 1; // 1 pixel margin
66    else
67      r -= 2; // 2 pixel margin
68
69    evas_vg_shape_append_circle(shape, w/2, h/2, r);
70 }
71
72 static void
73 _radio_icon_update(vg_radio *vd, double progress)
74 {
75    Evas_Coord w, h;
76    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
77    double center_x = ((double)w / 2);
78    double center_y = ((double)h / 2);
79    double offset = 1;
80    double outline_stroke;
81    ELM_RADIO_DATA_GET(vd->obj, rd);
82    if (!rd->state)
83      progress = 1 - progress;
84    else
85      offset = 2; // on case 2 pixel margin
86
87    outline_stroke = ELM_VG_SCALE_SIZE(vd->obj, 1) + progress * ELM_VG_SCALE_SIZE(vd->obj, 1.5);
88    double radius = (center_x < center_y ? center_x : center_y) - outline_stroke - offset;
89
90    //Iconic Circle (Outline)
91    evas_vg_shape_stroke_width_set(vd->shape[1], outline_stroke);
92    evas_vg_shape_reset(vd->shape[1]);
93    evas_vg_shape_append_circle(vd->shape[1], center_x, center_y, radius);
94
95    //Iconic Circle (Center)
96    radius = (radius - outline_stroke - ELM_VG_SCALE_SIZE(vd->obj, 4)) * progress;
97    evas_vg_shape_reset(vd->shape[2]);
98    evas_vg_shape_append_circle(vd->shape[2], center_x, center_y, radius);
99 }
100
101 static void
102 transit_radio_op(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED,
103                  double progress)
104 {
105    vg_radio *vd = effect;
106    _radio_icon_update(vd, progress);
107 }
108
109 static void
110 transit_radio_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
111 {
112    vg_radio *vd = data;
113    vd->transit = NULL;
114 }
115
116 static void
117 radio_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
118                        const char *emission EINA_UNUSED,
119                        const char *source)
120 {
121    vg_radio *vd = data;
122    if (!source) return;
123    if (strcmp(source, "tizen_vg")) return;
124
125    //Circle Effect
126    elm_transit_del(vd->transit);
127    vd->transit = elm_transit_add();
128    elm_transit_effect_add(vd->transit, transit_radio_op, vd,
129                           NULL);
130    elm_transit_del_cb_set(vd->transit, transit_radio_del_cb, vd);
131    elm_transit_tween_mode_set(vd->transit,
132                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
133    elm_transit_duration_set(vd->transit, 0.2);
134    elm_transit_go(vd->transit);
135
136    _radio_bg_update(vd);
137 }
138
139 static void
140 radio_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
141                       const char *emission EINA_UNUSED,
142                       const char *source)
143 {
144    vg_radio *vd = data;
145    if (!source) return;
146    if (strcmp(source, "tizen_vg")) return;
147
148    //Circle Effect
149    _radio_icon_update(vd, 1.0);
150    _radio_bg_update(vd);
151 }
152
153 static void
154 radio_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
155              void *event_info EINA_UNUSED)
156 {
157    vg_radio *vd = data;
158    evas_object_data_set(vd->obj, vg_key, NULL);
159    elm_object_signal_callback_del(vd->obj, "elm,radio,state,toggle", "tizen_vg", radio_state_toggle_cb);
160    elm_object_signal_callback_del(vd->obj, "elm,radio,action,toggle", "tizen_vg", radio_action_toggle_cb);
161    elm_transit_del(vd->transit);
162    evas_object_del(vd->vg[1]);
163    evas_object_del(vd->vg[2]);
164    free(vd);
165 }
166
167 static void
168 radio_base_resize_cb(void *data, Evas *e EINA_UNUSED,
169                      Evas_Object *obj EINA_UNUSED,
170                      void *event_info EINA_UNUSED)
171 {
172    vg_radio *vd = data;
173
174    radio_init(vd);
175    _radio_icon_update(vd, 1.0);
176 }
177
178 static void
179 radio_vg_bg_resize_cb(void *data, Evas *e EINA_UNUSED,
180                       Evas_Object *obj EINA_UNUSED,
181                       void *event_info EINA_UNUSED)
182 {
183    vg_radio *vd = data;
184    radio_init(vd);
185    _radio_bg_update(vd);
186 }
187
188 void
189 tizen_vg_radio_set(Elm_Radio *obj)
190 {
191    vg_radio *vd = evas_object_data_get(obj, vg_key);
192    if (vd) evas_object_del(vd->vg[0]);
193
194    //Apply vector ux only theme has "vector_ux"
195    const char *str = elm_layout_data_get(obj, "vector_ux");
196    if (!str) return;
197
198    vd = calloc(1, sizeof(vg_radio));
199    if (!vd)
200      {
201         ERR("Failed to allocate vector graphics data memory");
202         return;
203      }
204    evas_object_data_set(obj, vg_key, vd);
205    elm_object_signal_callback_add(obj, "elm,radio,state,toggle", "tizen_vg", radio_state_toggle_cb, vd);
206    elm_object_signal_callback_add(obj, "elm,radio,action,toggle", "tizen_vg", radio_action_toggle_cb, vd);
207
208
209    //Vector Graphics Object
210    Evas *e = evas_object_evas_get(obj);
211
212    vd->obj = obj;
213
214    //Check bg
215    vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
216    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
217                                   radio_vg_bg_resize_cb, vd);
218
219    //Outline VG
220    vd->vg[1] = evas_object_vg_add(e);
221    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_DEL,
222                                   radio_del_cb, vd);
223    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
224                                   radio_base_resize_cb, vd);
225
226    //Iconic Circle
227    vd->vg[2] = evas_object_vg_add(e);
228
229    elm_object_part_content_set(obj, "tizen_vg_shape_bg", vd->vg[0]);
230    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[1]);
231    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[2]);
232 }
233
234 void
235 tizen_vg_radio_state_set(Elm_Radio *obj)
236 {
237    // Fix for the state change visual change skips one frame.
238    // For vector enabled radio, visual change is handled in the
239    // code and it depends on "elm,radio,action,toggle" signal.
240    // as edje signal emit is asyn force one more message_signal to make sure
241    // state change related visual change occurs in the same frame.
242    edje_object_message_signal_process(elm_layout_edje_get(obj));
243 }
244
245 /////////////////////////////////////////////////////////////////////////
246 /* Check: Favorite */
247 /////////////////////////////////////////////////////////////////////////
248 typedef struct check_favorite_s
249 {
250    Evas_Object *vg[2]; //0: outline, 1: inner body
251    Efl_VG_Shape *shape[2];  //0: outline, 1: inner body
252    Elm_Transit *transit;
253    Evas_Object *obj;
254    Eina_Bool init : 1;
255    double scale_x;
256    double scale_y;
257 } check_favorite;
258
259 //favorite off svg path info
260 static const char *star_off = "M26.003,38.931c0.29,0,0.58,0.084,0.832,0.252\
261   l12.212,8.142c0.367,0.245,0.859,0.229,1.199-0.021c0.359-0.262,0.516-0.721,0.394-1.146l-4.104-14.367\
262   c-0.158-0.557,0.017-1.156,0.452-1.538l10.174-8.949c0.313-0.284,0.424-0.74,0.267-1.148c-0.159-0.415-0.546-0.681-0.987-0.681\
263   H33.433c-0.623,0-1.181-0.385-1.402-0.967L26.966,5.17c-0.153-0.398-0.549-0.67-0.98-0.67C25.55,4.501,25.154,4.773,25,5.177\
264   l-5.034,13.328c-0.221,0.583-0.779,0.97-1.404,0.97H5.557c-0.44,0-0.827,0.266-0.985,0.677c-0.158,0.413-0.049,0.869,0.279,1.164\
265   l10.158,8.937c0.434,0.383,0.609,0.981,0.451,1.538l-4.104,14.367c-0.123,0.425,0.033,0.883,0.387,1.14\
266   c0.357,0.258,0.85,0.271,1.211,0.028l12.217-8.144C25.423,39.015,25.713,38.931,26.003,38.931z";
267
268 //favorite on svg path info
269 static const char *star_on = "M39.633,49c-0.492,0-0.987-0.145-1.417-0.432l-12.212-8.141l-12.215,8.141\
270   c-0.892,0.598-2.059,0.57-2.926-0.061c-0.866-0.629-1.245-1.734-0.949-2.766l4.104-14.365L3.846,22.429\
271   c-0.788-0.71-1.055-1.828-0.676-2.814c0.378-0.987,1.326-1.641,2.385-1.641h13.007l5.036-13.331c0.377-0.989,1.326-1.64,2.384-1.643\
272   h0.003c1.056,0,2.003,0.651,2.384,1.637l5.063,13.337h13.011c1.061,0,2.007,0.652,2.387,1.641c0.38,0.988,0.109,2.104-0.677,2.814\
273   L37.98,31.377l4.104,14.365c0.294,1.031-0.085,2.137-0.947,2.766C40.692,48.834,40.162,49,39.633,49z";
274
275 static void
276 check_favorite_init(check_favorite *vd)
277 {
278    if (vd->init) return;
279    vd->init = EINA_TRUE;
280
281    //Outline Star
282    vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
283    evas_vg_node_origin_set(vd->shape[0], 14, 14);
284    evas_vg_shape_stroke_color_set(vd->shape[0], 255, 255, 255, 255);
285    evas_vg_shape_stroke_width_set(vd->shape[0], ELM_VG_SCALE_SIZE(vd->obj, 1.5));
286    evas_vg_shape_append_svg_path(vd->shape[0], star_off);
287
288    //Inner Body Star
289    vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
290    evas_vg_node_origin_set(vd->shape[1], 14, 14);
291    evas_vg_shape_append_svg_path(vd->shape[1], star_on);
292    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
293 }
294
295 static void
296 transit_check_favorite_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
297 {
298    check_favorite *vd = data;
299    vd->transit = NULL;
300 }
301
302 static void
303 _check_favorite(check_favorite *vd, double progress)
304 {
305    // star on svg has viewbox as -14 -14 80 80, so the center
306    // of the shape is (80 - 2 *14) = 26
307    double center_x = 26;
308    double center_y = 26;
309
310    if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
311
312    Eina_Matrix3 m;
313    eina_matrix3_identity(&m);
314    eina_matrix3_scale(&m, vd->scale_x, vd->scale_y);
315    eina_matrix3_translate(&m, center_x, center_y);
316    eina_matrix3_scale(&m, progress, progress);
317    eina_matrix3_translate(&m, -center_x, -center_y);
318    evas_vg_node_transformation_set(vd->shape[1], &m);
319 }
320
321 static void
322 transit_check_favorite_op(Elm_Transit_Effect *effect,
323                           Elm_Transit *transit EINA_UNUSED, double progress)
324 {
325    check_favorite *vd = effect;
326    _check_favorite(vd, progress);
327 }
328
329 static void
330 _transit_check_favorite_animation_finished(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
331 {
332    check_favorite *vd = effect;
333
334    elm_layout_signal_emit(vd->obj, "elm,action,animation,finished", "elm");
335 }
336
337 static void
338 check_favorite_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
339                             Evas_Object *obj EINA_UNUSED,
340                             void *event_info EINA_UNUSED)
341 {
342    Evas_Coord w, h;
343    check_favorite *vd = data;
344    check_favorite_init(vd);
345    // star on svg has viewbox as -14 -14 80 80, so the origin
346    // is shifted by 14.
347    double originx = 14;
348    double originy = 14;
349
350    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
351    vd->scale_x = w/80.0;
352    vd->scale_y = h/80.0;
353
354    originx = originx * vd->scale_x;
355    originy = originy * vd->scale_y;
356
357    // update origin
358    evas_vg_node_origin_set(vd->shape[0], originx, originy);
359    evas_vg_node_origin_set(vd->shape[1], originx, originy);
360
361    // apply it to outline star
362    Eina_Matrix3 m;
363    eina_matrix3_identity(&m);
364    eina_matrix3_scale(&m, vd->scale_x, vd->scale_y);
365    evas_vg_node_transformation_set(vd->shape[0], &m);
366
367    // update the inner star
368    _check_favorite(vd, 1);
369 }
370
371 static void
372 check_favorite_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
373                                 const char *emission EINA_UNUSED,
374                                 const char *source EINA_UNUSED)
375 {
376    check_favorite *vd = data;
377    if (!source) return;
378    if (strcmp(source, "tizen_vg")) return;
379
380    check_favorite_init(vd);
381
382    Eina_Bool check = elm_check_state_get(obj);
383
384    //Circle Effect
385    elm_transit_del(vd->transit);
386    vd->transit = elm_transit_add();
387    elm_transit_effect_add(vd->transit, transit_check_favorite_op, vd,
388                           _transit_check_favorite_animation_finished);
389    elm_transit_del_cb_set(vd->transit, transit_check_favorite_del_cb, vd);
390    elm_transit_tween_mode_set(vd->transit,
391                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
392    if (check)
393      {
394         elm_transit_duration_set(vd->transit, 0.3);
395         elm_transit_go_in(vd->transit, 0.1);
396      }
397    else
398      {
399         elm_transit_duration_set(vd->transit, 0.3);
400         elm_transit_go(vd->transit);
401      }
402 }
403
404 static void
405 check_favorite_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
406                                const char *emission EINA_UNUSED,
407                                const char *source EINA_UNUSED)
408 {
409    check_favorite *vd = data;
410    if (!source) return;
411    if (strcmp(source, "tizen_vg")) return;
412
413    check_favorite_init(vd);
414
415    _check_favorite(vd, 1.0);
416 }
417
418 static void
419 check_favorite_del_cb(void *data, Evas *e EINA_UNUSED,
420                       Evas_Object *obj EINA_UNUSED,
421                       void *event_info EINA_UNUSED)
422 {
423    check_favorite *vd = data;
424    evas_object_data_set(vd->obj, vg_key, NULL);
425    elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_favorite_state_toggle_cb);
426    elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_favorite_action_toggle_cb);
427    elm_transit_del(vd->transit);
428    evas_object_del(vd->vg[1]);
429    free(vd);
430 }
431
432 void
433 tizen_vg_check_favorite_set(Elm_Check *obj)
434 {
435    check_favorite *vd = calloc(1, sizeof(check_favorite));
436    if (!vd)
437      {
438         ERR("Failed to allocate vector graphics data memory");
439         return;
440      }
441    evas_object_data_set(obj, vg_key, vd);
442    elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_favorite_state_toggle_cb, vd);
443    elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_favorite_action_toggle_cb, vd);
444    vd->obj = obj;
445
446    //Outline Star
447    vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
448    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
449                                   check_favorite_del_cb, vd);
450    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
451                                   check_favorite_vg_resize_cb, vd);
452    //Inner Body Star
453    vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
454
455    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
456    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
457 }
458
459
460 /////////////////////////////////////////////////////////////////////////
461 /* Check: OnOff */
462 /////////////////////////////////////////////////////////////////////////
463 typedef struct check_onoff_s
464 {
465    Evas_Object *vg[3]; //0: bg, 1: overlapped circle, 2: line-circle
466    Efl_VG_Shape *shape[4];  //0: bg, 1: overlapped circle, 2: line, 3: circle
467    Elm_Transit *transit[3];  //0: circle, 1: line, 2: overlapped circle
468    Evas_Object *obj;
469    Eina_Bool init : 1;
470 } check_onoff;
471
472
473 static void
474 check_onoff_init(check_onoff *vd)
475 {
476    if (vd->init) return;
477    vd->init = EINA_TRUE;
478
479    //BG Circle
480    vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
481    evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
482
483    //Overlap Circle
484    vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
485    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
486
487    //Line Shape
488    vd->shape[2] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
489    evas_vg_shape_stroke_color_set(vd->shape[2], 255, 255, 255, 255);
490    evas_vg_shape_stroke_width_set(vd->shape[2], ELM_VG_SCALE_SIZE(vd->obj, 3));
491    evas_vg_shape_stroke_cap_set(vd->shape[2], EFL_GFX_CAP_ROUND);
492
493    //Circle Shape
494    vd->shape[3] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
495    evas_vg_shape_stroke_color_set(vd->shape[3], 255, 255, 255, 255);
496    evas_vg_shape_stroke_width_set(vd->shape[3], ELM_VG_SCALE_SIZE(vd->obj, 3));
497 }
498
499 static void
500 _check_onoff_circle(check_onoff *vd, double progress)
501 {
502    Evas_Coord w, h;
503    evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
504    double center_x = ((double)w / 2);
505    double center_y = ((double)h / 2);
506
507    evas_vg_shape_reset(vd->shape[3]);
508
509    double radius = (center_x < center_y ? center_x : center_y) -
510                    (ELM_VG_SCALE_SIZE(vd->obj, 3));
511
512    if (elm_check_state_get(vd->obj)) progress = 1 - progress;
513
514    evas_vg_shape_append_circle(vd->shape[3], center_x, center_y,
515                                      radius * progress);
516 }
517
518 static void
519 transit_check_onoff_circle_op(Elm_Transit_Effect *effect,
520                               Elm_Transit *transit EINA_UNUSED, double progress)
521 {
522    check_onoff *vd = effect;
523    _check_onoff_circle(vd, progress);
524 }
525
526 static void
527 transit_check_onoff_circle_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
528 {
529    check_onoff *vd = data;
530    vd->transit[0] = NULL;
531 }
532
533 static void
534 _check_onoff_line(check_onoff *vd, double progress)
535 {
536    Evas_Coord w, h;
537    evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
538    double center_x = ((double)w / 2);
539    double center_y = ((double)h / 2);
540
541    evas_vg_shape_reset(vd->shape[2]);
542
543    if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
544
545    double diff = center_y - ELM_VG_SCALE_SIZE(vd->obj, 3) - 1;
546
547    evas_vg_shape_append_move_to(vd->shape[2], center_x,
548                                       (center_y - (diff * progress)));
549    evas_vg_shape_append_line_to(vd->shape[2], center_x,
550                                       (center_y + (diff * progress)));
551 }
552
553 static void
554 transit_check_onoff_line_op(void *data, Elm_Transit *transit EINA_UNUSED,
555                             double progress)
556 {
557    check_onoff *vd = data;
558    _check_onoff_line(vd, progress);
559 }
560
561 static void
562 _transit_check_onoff_animation_finished(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
563 {
564    check_onoff *vd = effect;
565
566    elm_layout_signal_emit(vd->obj, "elm,action,animation,finished", "elm");
567 }
568
569 static void
570 transit_check_onoff_line_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
571 {
572    check_onoff *vd = data;
573    vd->transit[1] = NULL;
574 }
575
576 static void
577 _check_onoff_sizing(check_onoff *vd, double progress)
578 {
579    check_onoff_init(vd);
580
581    Evas_Coord w, h;
582    evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
583    double center_x = ((double)w / 2);
584    double center_y = ((double)h / 2);
585
586    if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
587    progress *= 0.3;
588
589    evas_vg_shape_reset(vd->shape[1]);
590    evas_vg_shape_append_circle(vd->shape[1],
591                                      center_x, center_y,
592                                      (0.7 + progress) * center_x);
593 }
594
595 static void
596 transit_check_onoff_sizing_op(void *data, Elm_Transit *transit EINA_UNUSED,
597                               double progress)
598 {
599    check_onoff *vd = data;
600    _check_onoff_sizing(vd, progress);
601 }
602
603 static void
604 transit_check_onoff_sizing_del_cb(void *data,
605                                   Elm_Transit *transit EINA_UNUSED)
606 {
607    check_onoff *vd = data;
608    vd->transit[2] = NULL;
609 }
610
611 static void
612 check_onoff_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
613                              const char *emission EINA_UNUSED,
614                              const char *source EINA_UNUSED)
615 {
616    check_onoff *vd = data;
617    if (!source) return;
618    if (strcmp(source, "tizen_vg")) return;
619
620    check_onoff_init(vd);
621
622    Eina_Bool check = elm_check_state_get(obj);
623
624    //Circle Effect
625    elm_transit_del(vd->transit[0]);
626    vd->transit[0] = elm_transit_add();
627    elm_transit_effect_add(vd->transit[0], transit_check_onoff_circle_op, vd,
628                           NULL);
629    elm_transit_del_cb_set(vd->transit[0], transit_check_onoff_circle_del_cb,
630                           vd);
631    elm_transit_tween_mode_set(vd->transit[0],
632                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
633    if (check)
634      {
635         elm_transit_duration_set(vd->transit[0], 0.1);
636         elm_transit_go(vd->transit[0]);
637      }
638    else
639      {
640         elm_transit_duration_set(vd->transit[0], 0.25);
641         elm_transit_go_in(vd->transit[0], 0.05);
642      }
643
644    //Line Effect
645    elm_transit_del(vd->transit[1]);
646    vd->transit[1] = elm_transit_add();
647    elm_transit_effect_add(vd->transit[1], transit_check_onoff_line_op, vd,
648                           NULL);
649    elm_transit_del_cb_set(vd->transit[1], transit_check_onoff_line_del_cb,
650                           vd);
651    elm_transit_tween_mode_set(vd->transit[1],
652                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
653    if (check)
654      {
655         elm_transit_duration_set(vd->transit[1], 0.25);
656         elm_transit_go_in(vd->transit[1], 0.05);
657
658         //Overlap Circle Sizing Effect
659         elm_transit_del(vd->transit[2]);
660         vd->transit[2] = elm_transit_add();
661         elm_transit_effect_add(vd->transit[2], transit_check_onoff_sizing_op, vd,
662                                _transit_check_onoff_animation_finished);
663         elm_transit_del_cb_set(vd->transit[2], transit_check_onoff_sizing_del_cb,
664                                vd);
665         elm_transit_tween_mode_set(vd->transit[2],
666                                    ELM_TRANSIT_TWEEN_MODE_DECELERATE);
667         elm_transit_duration_set(vd->transit[2], 0.3);
668         elm_transit_go(vd->transit[2]);
669      }
670    else
671      {
672         elm_transit_duration_set(vd->transit[1], 0.1);
673         elm_transit_go(vd->transit[1]);
674      }
675 }
676
677 static void
678 check_onoff_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
679                             const char *emission EINA_UNUSED,
680                             const char *source EINA_UNUSED)
681 {
682    check_onoff *vd = data;
683    if (!source) return;
684    if (strcmp(source, "tizen_vg")) return;
685
686    check_onoff_init(vd);
687
688    _check_onoff_circle(vd, 1.0);
689    _check_onoff_line(vd, 1.0);
690    _check_onoff_sizing(vd, 1.0);
691 }
692
693 static void
694 check_onoff_del_cb(void *data, Evas *e EINA_UNUSED,
695                    Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
696 {
697    check_onoff *vd = data;
698    evas_object_data_set(vd->obj, vg_key, NULL);
699    elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_onoff_state_toggle_cb);
700    elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_onoff_action_toggle_cb);
701    elm_transit_del(vd->transit[0]);
702    elm_transit_del(vd->transit[1]);
703    elm_transit_del(vd->transit[2]);
704    evas_object_del(vd->vg[1]);
705    evas_object_del(vd->vg[2]);
706    free(vd);
707 }
708
709 static void
710 check_onoff_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
711                          Evas_Object *obj EINA_UNUSED,
712                          void *event_info EINA_UNUSED)
713 {
714    check_onoff *vd = data;
715
716    check_onoff_init(vd);
717
718    Evas_Coord w, h;
719    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
720    Evas_Coord center_x = (w / 2);
721    Evas_Coord center_y = (h / 2);
722
723    evas_vg_shape_reset(vd->shape[0]);
724    evas_vg_shape_append_circle(vd->shape[0], center_x, center_y,
725                                      center_x);
726 }
727
728 static void
729 check_onoff_vg2_resize_cb(void *data, Evas *e EINA_UNUSED,
730                           Evas_Object *obj EINA_UNUSED,
731                           void *event_info EINA_UNUSED)
732 {
733    check_onoff *vd = data;
734
735    check_onoff_init(vd);
736
737    Evas_Coord w, h;
738    evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
739    double center_x = ((double)w / 2);
740    double center_y = ((double)h / 2);
741
742    evas_vg_shape_reset(vd->shape[1]);
743    evas_vg_shape_append_circle(vd->shape[1],
744                                      center_x, center_y,
745                                      center_x);
746 }
747
748 static void
749 check_onoff_vg3_resize_cb(void *data, Evas *e EINA_UNUSED,
750                           Evas_Object *obj EINA_UNUSED,
751                           void *event_info EINA_UNUSED)
752 {
753    check_onoff *vd = data;
754
755    check_onoff_init(vd);
756
757    Evas_Coord w, h;
758    evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
759    double center_x = ((double)w / 2);
760    double center_y = ((double)h / 2);
761
762    evas_vg_shape_reset(vd->shape[2]);
763    evas_vg_shape_reset(vd->shape[3]);
764
765    //Line
766    if (elm_check_state_get(vd->obj))
767      {
768         double diff = ELM_VG_SCALE_SIZE(vd->obj, 3) - 1;
769
770         evas_vg_shape_append_move_to(vd->shape[2], center_x, diff);
771         evas_vg_shape_append_line_to(vd->shape[2], center_x, h - diff);
772      }
773    //Circle
774    else
775      {
776         double radius = (center_x < center_y ? center_x : center_y) -
777                         (ELM_VG_SCALE_SIZE(vd->obj, 3));
778         evas_vg_shape_append_circle(vd->shape[3],
779                                           center_x, center_y, radius);
780      }
781 }
782
783 void
784 tizen_vg_check_onoff_set(Elm_Check *obj)
785 {
786    check_onoff *vd = calloc(1, sizeof(check_onoff));
787    if (!vd)
788      {
789         ERR("Failed to allocate vector graphics data memory");
790         return;
791      }
792    evas_object_data_set(obj, vg_key, vd);
793
794    elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_onoff_state_toggle_cb, vd);
795    elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_onoff_action_toggle_cb, vd);
796
797    vd->obj = obj;
798
799    //Base (BG) VG
800    vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
801    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
802                                   check_onoff_del_cb, vd);
803    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
804                                   check_onoff_vg_resize_cb, vd);
805    //Overlapped Circle VG
806    vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
807    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
808                                   check_onoff_vg2_resize_cb, vd);
809    //Line-Circle VG
810    vd->vg[2] = evas_object_vg_add(evas_object_evas_get(obj));
811    evas_object_event_callback_add(vd->vg[2], EVAS_CALLBACK_RESIZE,
812                                   check_onoff_vg3_resize_cb, vd);
813
814    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
815    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
816    elm_object_part_content_set(obj, "tizen_vg_shape3", vd->vg[2]);
817 }
818
819
820
821 /////////////////////////////////////////////////////////////////////////
822 /* Check: Default */
823 /////////////////////////////////////////////////////////////////////////
824 typedef struct check_default_s
825 {
826    Evas_Object *vg[3]; //0: base, 1: line 2: bg
827    Efl_VG_Shape *shape[5];  //0: outline, 1: bg, 2: left line, 3: right line 4: bg
828    Elm_Transit *transit[3]; //0: bg color, 1: bg scale, 2: check lines
829    Evas_Object *obj;
830    double left_move_to[2];
831    double left_line_to[2];
832    double right_move_to[2];
833    double right_line_to[2];
834    Eina_Bool init : 1;
835 } check_default;
836
837 static const char *check_default_fill = "M7.279,2h35.442C45.637,2,48,4.359,48,7.271v35.455\
838   C48,45.639,45.637,48,42.723,48H7.279C4.362,47.997,2,45.639,2,42.727 V7.271C2,4.359,4.362,2,7.279,2z";
839
840 static const char *check_default_outline= "M7.32,2.5h35.361c2.662,0,4.818,2.159,4.818,4.82\
841   v35.361c0,2.663-2.156,4.819-4.818,4.819H7.32c-2.661,0-4.82-2.156-4.82-4.82V7.32C2.5,4.659,4.659,2.5,7.32,2.5z";
842
843 static void
844 check_default_init(check_default *vd)
845 {
846    if (vd->init) return;
847    vd->init = EINA_TRUE;
848
849    // bg sahpe
850    Efl_VG *bg_root = evas_object_vg_root_node_get(vd->vg[2]);
851    vd->shape[4] = evas_vg_shape_add(bg_root);
852
853
854    Efl_VG *base_root = evas_object_vg_root_node_get(vd->vg[0]);
855    //outline
856    vd->shape[0] = evas_vg_shape_add(base_root);
857    //effect
858    vd->shape[1] = evas_vg_shape_add(base_root);
859
860    // check icon
861    Efl_VG *line_root = evas_object_vg_root_node_get(vd->vg[1]);
862    //Left Line Shape
863    vd->shape[2] = evas_vg_shape_add(line_root);
864    evas_vg_shape_stroke_width_set(vd->shape[2], ELM_VG_SCALE_SIZE(vd->obj, 1.75));
865    evas_vg_shape_stroke_color_set(vd->shape[2], 255, 255, 255, 255);
866    evas_vg_shape_stroke_cap_set(vd->shape[2], EFL_GFX_CAP_ROUND);
867
868    //Right Line Shape
869    vd->shape[3] = evas_vg_shape_add(line_root);
870    evas_vg_shape_stroke_width_set(vd->shape[3], ELM_VG_SCALE_SIZE(vd->obj, 1.75));
871    evas_vg_shape_stroke_color_set(vd->shape[3], 255, 255, 255, 255);
872    evas_vg_shape_stroke_cap_set(vd->shape[3], EFL_GFX_CAP_ROUND);
873
874    vd->left_move_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -5);
875    vd->left_move_to[1] = ELM_VG_SCALE_SIZE(vd->obj, 10);
876    vd->left_line_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -8);
877    vd->left_line_to[1] = ELM_VG_SCALE_SIZE(vd->obj, -8);
878
879    vd->right_move_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -5);
880    vd->right_move_to[1] = ELM_VG_SCALE_SIZE(vd->obj, 10);
881    vd->right_line_to[0] = ELM_VG_SCALE_SIZE(vd->obj, 18);
882    vd->right_line_to[1] = ELM_VG_SCALE_SIZE(vd->obj, -18);
883 }
884
885 static void
886 _update_default_check_shape(check_default *vd EINA_UNUSED, Efl_VG *shape, Eina_Bool outline, Eo *obj)
887 {
888    Evas_Coord w, h;
889    Eina_Matrix3 m;
890
891    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
892    double scale_x = w / 50.0;
893    double scale_y = h / 50.0;
894    eina_matrix3_identity(&m);
895    eina_matrix3_scale(&m, scale_x, scale_y);
896    evas_vg_shape_reset(shape);
897    if (outline)
898      {
899         // outline
900         evas_vg_shape_append_svg_path(shape, check_default_outline);
901         if (eina_matrix3_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY)
902           evas_vg_node_transformation_set(shape, &m);
903
904         evas_vg_shape_stroke_width_set(shape, 1.5);
905         // update color
906         evas_vg_node_color_set(shape, 0, 0, 0, 0);
907         evas_vg_shape_stroke_color_set(shape, 255, 255, 255, 255);
908      }
909    else
910      {
911         // fill
912         evas_vg_shape_append_svg_path(shape, check_default_fill);
913         if (eina_matrix3_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY)
914           evas_vg_node_transformation_set(shape, &m);
915
916         // update color
917         evas_vg_node_color_set(shape, 255, 255, 255, 255);
918         evas_vg_shape_stroke_color_set(shape, 0, 0, 0, 0);
919      }
920 }
921
922 static void
923 check_default_vg_bg_resize_cb(void *data, Evas *e EINA_UNUSED,
924                                 Evas_Object *obj EINA_UNUSED,
925                                 void *event_info EINA_UNUSED)
926 {
927    check_default *vd = data;
928    check_default_init(vd);
929    _update_default_check_shape(vd, vd->shape[4], elm_check_state_get(vd->obj), vd->vg[2]);
930 }
931
932 static void
933 check_default_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
934                            Evas_Object *obj EINA_UNUSED,
935                            void *event_info EINA_UNUSED)
936 {
937    check_default *vd = data;
938
939    check_default_init(vd);
940
941    Evas_Coord w, h;
942    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
943    double center_x = ((double)w / 2);
944    double center_y = ((double)h / 2);
945
946    //Update Outline Shape
947    _update_default_check_shape(vd, vd->shape[0], EINA_TRUE, vd->vg[0]);
948
949    //Update BG Shape
950    _update_default_check_shape(vd, vd->shape[1], EINA_FALSE, vd->vg[0]);
951
952    if (elm_check_state_get(vd->obj))
953      evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
954    else
955      evas_vg_node_color_set(vd->shape[1], 0, 0, 0, 0);
956
957    //Update Line Shape
958    if (elm_check_state_get(vd->obj))
959      {
960         //Left
961         evas_vg_shape_reset(vd->shape[2]);
962         evas_vg_shape_append_move_to(vd->shape[2],
963                                            center_x + vd->left_move_to[0],
964                                            center_y + vd->left_move_to[1]);
965         evas_vg_shape_append_line_to(vd->shape[2],
966                                            (center_x + vd->left_move_to[0]) +
967                                            (vd->left_line_to[0]),
968                                            (center_y + vd->left_move_to[1]) +
969                                            (vd->left_line_to[1]));
970         //Right
971         evas_vg_shape_reset(vd->shape[3]);
972         evas_vg_shape_append_move_to(vd->shape[3],
973                                            center_x + vd->right_move_to[0],
974                                            center_y + vd->right_move_to[1]);
975         evas_vg_shape_append_line_to(vd->shape[3],
976                                            (center_x + vd->right_move_to[0]) +
977                                            (vd->right_line_to[0]),
978                                            (center_y + vd->right_move_to[1]) +
979                                            (vd->right_line_to[1]));
980      }
981 }
982
983 static void
984 transit_check_default_bg_color_del_cb(Elm_Transit_Effect *effect,
985                                       Elm_Transit *transit EINA_UNUSED)
986 {
987    check_default *vd = effect;
988    vd->transit[0] = NULL;
989 }
990
991
992 static void
993 _check_default_bg_color(check_default *vd, double progress)
994 {
995    int color;
996
997    if (elm_check_state_get(vd->obj)) color = 255 * progress;
998    else color = 255 * (1 - progress);
999
1000    evas_vg_node_color_set(vd->shape[1], color, color, color, color);
1001    evas_vg_shape_stroke_color_set(vd->shape[0], 255 - color, 255 - color, 255 - color, 255 -color);
1002 }
1003
1004 static void
1005 transit_check_default_bg_color_op(Elm_Transit_Effect *effect,
1006                                   Elm_Transit *transit EINA_UNUSED,
1007                                   double progress)
1008 {
1009    check_default *vd = effect;
1010    _check_default_bg_color(vd, progress);
1011 }
1012
1013 static void
1014 _transit_check_default_animation_finished(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
1015 {
1016    check_default *vd = effect;
1017
1018    elm_layout_signal_emit(vd->obj, "elm,action,animation,finished", "elm");
1019 }
1020
1021 static void
1022 transit_check_default_bg_scale_del_cb(Elm_Transit_Effect *effect,
1023                                       Elm_Transit *transit EINA_UNUSED)
1024 {
1025    check_default *vd = effect;
1026    vd->transit[1] = NULL;
1027 }
1028
1029 static void
1030 _check_default_bg_scale(check_default *vd, double progress)
1031 {
1032    // as the viewbox of the check_on svg is 0 0 50 50
1033    // center of the svg is 25 25
1034    Evas_Coord w, h;
1035    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
1036    double scale_x = w/50.0;
1037    double scale_y = h/50.0;
1038
1039    Eina_Matrix3 m;
1040    eina_matrix3_identity(&m);
1041    eina_matrix3_scale(&m, scale_x, scale_y);
1042    eina_matrix3_translate(&m, 25, 25);
1043    eina_matrix3_scale(&m, progress, progress);
1044    eina_matrix3_translate(&m, -25, -25);
1045    evas_vg_node_transformation_set(vd->shape[1], &m);
1046 }
1047 static void
1048 transit_check_default_bg_scale_op(Elm_Transit_Effect *effect,
1049                                   Elm_Transit *transit EINA_UNUSED,
1050                                   double progress)
1051 {
1052    check_default *vd = effect;
1053    _check_default_bg_scale(vd, progress);
1054 }
1055
1056 static void
1057 transit_check_default_line_del_cb(Elm_Transit_Effect *effect,
1058                                   Elm_Transit *transit EINA_UNUSED)
1059 {
1060    check_default *vd = effect;
1061    vd->transit[2] = NULL;
1062 }
1063
1064 static void
1065 _check_default_line(check_default *vd, double progress)
1066 {
1067    Evas_Coord w, h;
1068    evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
1069    double center_x = ((double)w / 2);
1070    double center_y = ((double)h / 2);
1071
1072    //Update Line Shape
1073    if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
1074
1075    //Left
1076    evas_vg_shape_reset(vd->shape[2]);
1077    evas_vg_shape_append_move_to(vd->shape[2],
1078                                       center_x + vd->left_move_to[0],
1079                                       center_y + vd->left_move_to[1]);
1080    evas_vg_shape_append_line_to(vd->shape[2],
1081                                       (center_x + vd->left_move_to[0]) +
1082                                       (vd->left_line_to[0] * progress),
1083                                       (center_y + vd->left_move_to[1]) +
1084                                       (vd->left_line_to[1] * progress));
1085
1086    //Right
1087    evas_vg_shape_reset(vd->shape[3]);
1088    evas_vg_shape_append_move_to(vd->shape[3],
1089                                       center_x + vd->right_move_to[0],
1090                                       center_y + vd->right_move_to[1]);
1091    evas_vg_shape_append_line_to(vd->shape[3],
1092                                       (center_x + vd->right_move_to[0]) +
1093                                       (vd->right_line_to[0] * progress),
1094                                       (center_y + vd->right_move_to[1]) +
1095                                       (vd->right_line_to[1] * progress));
1096 }
1097
1098 static void
1099 transit_check_default_line_op(Elm_Transit_Effect *effect,
1100                               Elm_Transit *transit EINA_UNUSED, double progress)
1101 {
1102    check_default *vd = effect;
1103    _check_default_line(vd, progress);
1104 }
1105
1106 static void
1107 check_default_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
1108                                const char *emission EINA_UNUSED,
1109                                const char *source EINA_UNUSED)
1110 {
1111    check_default *vd = data;
1112    if (!source) return;
1113    if (strcmp(source, "tizen_vg")) return;
1114
1115    check_default_init(vd);
1116
1117    Eina_Bool check = elm_check_state_get(obj);
1118
1119    //BG Color Effect
1120    elm_transit_del(vd->transit[0]);
1121    vd->transit[0] = elm_transit_add();
1122    elm_transit_effect_add(vd->transit[0], transit_check_default_bg_color_op, vd,
1123                           _transit_check_default_animation_finished);
1124    elm_transit_del_cb_set(vd->transit[0], transit_check_default_bg_color_del_cb,
1125                           vd);
1126    elm_transit_tween_mode_set(vd->transit[0],
1127                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
1128
1129    if (check)
1130      {
1131         elm_transit_duration_set(vd->transit[0], 0.3);
1132         elm_transit_go(vd->transit[0]);
1133      }
1134    else
1135      {
1136         elm_transit_duration_set(vd->transit[0], 0.2);
1137         elm_transit_go_in(vd->transit[0], 0.15);
1138      }
1139
1140    //BG Size Effect
1141    elm_transit_del(vd->transit[1]);
1142
1143    if (check)
1144      {
1145         vd->transit[1] = elm_transit_add();
1146         elm_transit_effect_add(vd->transit[1],
1147                                transit_check_default_bg_scale_op, vd, NULL);
1148         elm_transit_del_cb_set(vd->transit[1],
1149                                transit_check_default_bg_scale_del_cb, vd);
1150         elm_transit_tween_mode_set(vd->transit[1],
1151                                    ELM_TRANSIT_TWEEN_MODE_DECELERATE);
1152         elm_transit_duration_set(vd->transit[1], 0.15);
1153         elm_transit_go(vd->transit[1]);
1154      }
1155
1156    //Draw Line
1157    elm_transit_del(vd->transit[2]);
1158
1159    vd->transit[2] = elm_transit_add();
1160    elm_transit_effect_add(vd->transit[2], transit_check_default_line_op, vd,
1161                           NULL);
1162    elm_transit_del_cb_set(vd->transit[2], transit_check_default_line_del_cb,
1163                           vd);
1164    elm_transit_tween_mode_set(vd->transit[2],
1165                               ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL);
1166    elm_transit_duration_set(vd->transit[2], 0.15);
1167
1168    if (check)
1169      elm_transit_go_in(vd->transit[2], 0.15);
1170    else
1171      elm_transit_go(vd->transit[2]);
1172
1173    _update_default_check_shape(vd, vd->shape[4], elm_check_state_get(vd->obj), vd->vg[2]);
1174 }
1175
1176 static void
1177 check_default_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
1178                               const char *emission EINA_UNUSED,
1179                               const char *source EINA_UNUSED)
1180 {
1181    check_default *vd = data;
1182    if (!source) return;
1183    if (strcmp(source, "tizen_vg")) return;
1184
1185    check_default_init(vd);
1186
1187    _check_default_bg_color(vd, 1.0);
1188    _check_default_bg_scale(vd, 1.0);
1189    _check_default_line(vd, 1.0);
1190    _update_default_check_shape(vd, vd->shape[4], elm_check_state_get(vd->obj), vd->vg[2]);
1191
1192    // update outline color
1193    if (elm_check_state_get(vd->obj))
1194      evas_vg_shape_stroke_color_set(vd->shape[0], 0, 0, 0, 0);
1195    else
1196      evas_vg_shape_stroke_color_set(vd->shape[0], 255, 255, 255, 255);
1197 }
1198
1199 static void
1200 check_default_del_cb(void *data, Evas *e EINA_UNUSED,
1201                      Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1202 {
1203    check_default *vd = data;
1204    evas_object_data_set(vd->obj, vg_key, NULL);
1205    elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_default_state_toggle_cb);
1206    elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_default_action_toggle_cb);
1207    elm_transit_del(vd->transit[0]);
1208    elm_transit_del(vd->transit[1]);
1209    elm_transit_del(vd->transit[2]);
1210    evas_object_del(vd->vg[1]);
1211    evas_object_del(vd->vg[2]);
1212    free(vd);
1213 }
1214
1215 void
1216 tizen_vg_check_default_set(Elm_Check *obj)
1217 {
1218    check_default *vd = calloc(1, sizeof(check_default));
1219    if (!vd)
1220      {
1221         ERR("Failed to allocate vector graphics data memory");
1222         return;
1223      }
1224    evas_object_data_set(obj, vg_key, vd);
1225
1226    elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_default_state_toggle_cb, vd);
1227    elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_default_action_toggle_cb, vd);
1228
1229    vd->obj = obj;
1230
1231    //Check bg
1232    vd->vg[2] = evas_object_vg_add(evas_object_evas_get(obj));
1233    evas_object_event_callback_add(vd->vg[2], EVAS_CALLBACK_RESIZE,
1234                                   check_default_vg_bg_resize_cb, vd);
1235
1236    //Base VG
1237    vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
1238    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1239                                   check_default_del_cb, vd);
1240    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1241                                   check_default_vg_resize_cb, vd);
1242    //Check Line VG
1243    vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
1244
1245    elm_object_part_content_set(obj, "tizen_vg_shape_bg", vd->vg[2]);
1246    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
1247    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
1248 }
1249
1250 void
1251 tizen_vg_check_set(Elm_Check *obj)
1252 {
1253    check_default *vd = evas_object_data_get(obj, vg_key);
1254    if (vd) evas_object_del(vd->vg[0]);
1255
1256    //Apply vector ux only theme has "vector_ux"
1257    const char *str = elm_layout_data_get(obj, "vector_ux");
1258    if (!str) return;
1259
1260    if (!strcmp(str, "default"))
1261      tizen_vg_check_default_set(obj);
1262    else if (!strcmp(str, "on&off"))
1263      tizen_vg_check_onoff_set(obj);
1264    else if (!strcmp(str, "favorite"))
1265      tizen_vg_check_favorite_set(obj);
1266 }
1267
1268 void
1269 tizen_vg_check_state_set(Elm_Check *obj)
1270 {
1271    // Fix for the state change visual change skips one frame.
1272    // For vector enabled checkbox , state change visual change is handled in the
1273    // code and it depends on "elm,check,action,toggle" signal.
1274    // as edje signal emit is asyn force one more message_signal to make sure
1275    // state change related visual change occurs in the same frame.
1276    edje_object_message_signal_process(elm_layout_edje_get(obj));
1277 }
1278
1279 /////////////////////////////////////////////////////////////////////////
1280 /* Button */
1281 /////////////////////////////////////////////////////////////////////////
1282 typedef struct vg_button_s
1283 {
1284    Evas_Object *vg[2];       //0: base, 1: effect
1285    Efl_VG_Shape *shape[2];   //0: base, 1: effect
1286    Evas_Object *obj;
1287    Evas_Coord corner;
1288    Eina_Bool init : 1;
1289    Eina_Bool is_circle : 1;
1290 } vg_button;
1291
1292 static void
1293 button_no_bg_init(vg_button *vd)
1294 {
1295    if (vd->init) return;
1296    vd->init = EINA_TRUE;
1297
1298    //Effect Shape
1299    Efl_VG *effect_root = evas_object_vg_root_node_get(vd->vg[0]);
1300    vd->shape[0] = evas_vg_shape_add(effect_root);
1301    evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
1302 }
1303
1304 static void
1305 button_effect_no_bg_resize_cb(void *data, Evas *e EINA_UNUSED,
1306                         Evas_Object *obj EINA_UNUSED,
1307                         void *event_info EINA_UNUSED)
1308 {
1309    vg_button *vd = data;
1310
1311    button_no_bg_init(vd);
1312
1313    //Update Effect Shape
1314    Evas_Coord x, y, w, h;
1315    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1316    evas_vg_shape_reset(vd->shape[0]);
1317    if (vd->is_circle)
1318      {
1319         double radius_w = w / 2.0;
1320         double radius_h = h / 2.0;
1321         evas_vg_shape_append_circle(vd->shape[0], radius_w, radius_h, radius_w);
1322      }
1323    else
1324      {
1325         Evas_Coord w2, h2;
1326         double effect_ratio;
1327
1328         if (!edje_object_part_geometry_get(elm_layout_edje_get(vd->obj), "effect_spacer", NULL, NULL, &w2, &h2))
1329           evas_object_geometry_get(vd->obj, NULL, NULL, &w2, &h2);
1330         effect_ratio = (w2 < h2) ? (double)w / w2 : (double)h / h2;
1331         evas_vg_shape_append_rect(vd->shape[0], 0, 0, w, h, vd->corner * effect_ratio, vd->corner * effect_ratio);
1332      }
1333 }
1334
1335 static void
1336 button_no_bg_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
1337               void *event_info EINA_UNUSED)
1338 {
1339    vg_button *vd = data;
1340    evas_object_data_del(vd->obj, vg_key);
1341    free(vd);
1342 }
1343
1344 void
1345 tizen_vg_button_no_bg_set(Elm_Button *obj)
1346 {
1347    vg_button *vd = evas_object_data_get(obj, vg_key);
1348    if (vd)
1349      {
1350         elm_object_part_content_unset(obj, "tizen_vg_shape");
1351         evas_object_del(vd->vg[0]);
1352      }
1353
1354    vd = calloc(1, sizeof(vg_button));
1355    if (!vd)
1356      {
1357         ERR("Failed to allocate vector graphics data memory");
1358         return;
1359      }
1360    evas_object_data_set(obj, vg_key, vd);
1361
1362    //Vector Graphics Object
1363    Evas *e = evas_object_evas_get(obj);
1364
1365    vd->obj = obj;
1366
1367    //Effect VG
1368    vd->vg[0] = evas_object_vg_add(e);
1369    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1370                                   button_no_bg_del_cb, vd);
1371
1372    // Check whether the button has circle shape.
1373    // When the button has no background and has circle shape,
1374    // the vector_ux will be "no_bg/circle".
1375    const char *str = elm_layout_data_get(obj, "vector_ux");
1376    if (str && strstr(str, "circle"))
1377      vd->is_circle = EINA_TRUE;
1378    else
1379      {
1380         // Since it is not circle, it has rectangle shape.
1381         str = elm_layout_data_get(obj, "corner_radius");
1382         if (str) vd->corner = ELM_VG_SCALE_SIZE(obj, atoi(str));
1383      }
1384
1385    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1386                                   button_effect_no_bg_resize_cb, vd);
1387
1388    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
1389 }
1390
1391 static void
1392 button_init(vg_button *vd)
1393 {
1394    if (vd->init) return;
1395    vd->init = EINA_TRUE;
1396
1397    //Base Shape
1398    Efl_VG *base_root = evas_object_vg_root_node_get(vd->vg[0]);
1399    vd->shape[0] = evas_vg_shape_add(base_root);
1400    evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
1401
1402    //Effect Shape
1403    Efl_VG *effect_root = evas_object_vg_root_node_get(vd->vg[1]);
1404    vd->shape[1] = evas_vg_shape_add(effect_root);
1405    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
1406 }
1407
1408 static void
1409 button_effect_resize_cb(void *data, Evas *e EINA_UNUSED,
1410                         Evas_Object *obj EINA_UNUSED,
1411                         void *event_info EINA_UNUSED)
1412 {
1413    vg_button *vd = data;
1414
1415    button_init(vd);
1416
1417    //Update Effect Shape
1418    Evas_Coord x, y, w, h;
1419    evas_object_geometry_get(vd->vg[1], &x, &y, &w, &h);
1420    evas_vg_shape_reset(vd->shape[1]);
1421    if (vd->is_circle)
1422      {
1423         double radius_w = w / 2.0;
1424         double radius_h = h / 2.0;
1425         evas_vg_shape_append_circle(vd->shape[1], radius_w, radius_h, radius_w);
1426      }
1427    else
1428      {
1429         Evas_Coord w2, h2;
1430         double effect_ratio;
1431
1432         if (!edje_object_part_geometry_get(elm_layout_edje_get(vd->obj), "effect_spacer", NULL, NULL, &w2, &h2))
1433           evas_object_geometry_get(vd->vg[0], NULL, NULL, &w2, &h2);
1434         effect_ratio = (w2 < h2) ? (double)w / w2 : (double)h / h2;
1435         evas_vg_shape_append_rect(vd->shape[1], 0, 0, w, h, vd->corner * effect_ratio, vd->corner * effect_ratio);
1436      }
1437 }
1438
1439 static void
1440 button_base_resize_cb(void *data, Evas *e EINA_UNUSED,
1441                       Evas_Object *obj EINA_UNUSED,
1442                       void *event_info EINA_UNUSED)
1443 {
1444    vg_button *vd = data;
1445
1446    button_init(vd);
1447
1448    //Update Base Shape
1449    Evas_Coord w, h;
1450    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
1451    evas_vg_shape_reset(vd->shape[0]);
1452    if (vd->is_circle)
1453      {
1454         double radius_w = w / 2.0;
1455         double radius_h = h / 2.0;
1456         evas_vg_shape_append_circle(vd->shape[0], radius_w, radius_h, radius_w);
1457      }
1458    else
1459      evas_vg_shape_append_rect(vd->shape[0], 0, 0, w, h, vd->corner, vd->corner);
1460 }
1461
1462 static void
1463 button_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
1464               void *event_info EINA_UNUSED)
1465 {
1466    vg_button *vd = data;
1467    evas_object_data_del(vd->obj, vg_key);
1468    evas_object_del(vd->vg[1]);
1469    free(vd);
1470 }
1471
1472 void
1473 tizen_vg_button_default_set(Elm_Button *obj)
1474 {
1475    vg_button *vd = evas_object_data_get(obj, vg_key);
1476    if (vd)
1477      {
1478         elm_object_part_content_unset(obj, "tizen_vg_shape");
1479         elm_object_part_content_unset(obj, "tizen_vg_shape2");
1480         evas_object_del(vd->vg[0]);
1481      }
1482    vd = calloc(1, sizeof(vg_button));
1483    if (!vd)
1484      {
1485         ERR("Failed to allocate vector graphics data memory");
1486         return;
1487      }
1488    evas_object_data_set(obj, vg_key, vd);
1489
1490    //Vector Graphics Object
1491    Evas *e = evas_object_evas_get(obj);
1492
1493    vd->obj = obj;
1494
1495    // Check whether the button has circle shape.
1496    // When the button has no background and has circle shape,
1497    // the vector_ux will be "no_bg/circle".
1498    const char *str = elm_layout_data_get(obj, "vector_ux");
1499    if (str && strstr(str, "circle"))
1500      vd->is_circle = EINA_TRUE;
1501    else
1502      {
1503         // Since it is not circle, it has rectangle shape.
1504         str = elm_layout_data_get(obj, "corner_radius");
1505         if (str) vd->corner = ELM_VG_SCALE_SIZE(obj, atoi(str));
1506      }
1507
1508    //Base VG
1509    vd->vg[0] = evas_object_vg_add(e);
1510    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1511                                   button_del_cb, vd);
1512    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1513                                   button_base_resize_cb, vd);
1514    //Effect VG
1515    vd->vg[1] = evas_object_vg_add(e);
1516    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
1517                                   button_effect_resize_cb, vd);
1518
1519    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
1520    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
1521 }
1522
1523 void
1524 tizen_vg_button_set(Elm_Button *obj)
1525 {
1526    //Apply vector ux only theme has "vector_ux"
1527    const char *str = elm_layout_data_get(obj, "vector_ux");
1528    if (!str) return;
1529
1530    // Check whether the button has a background.
1531    if (!strncmp(str, "no_bg", strlen("no_bg")))
1532      tizen_vg_button_no_bg_set(obj);
1533    else
1534      tizen_vg_button_default_set(obj);
1535 }
1536
1537 /////////////////////////////////////////////////////////////////////////
1538 /* Progressbar */
1539 /////////////////////////////////////////////////////////////////////////
1540
1541 typedef struct vg_progressbar_s
1542 {
1543    Evas_Object *vg[3];       //0: base, 1: layer1, 2:layer2
1544    Efl_VG_Shape *shape[3];   //0: base, 1: layer1, 2: layer2
1545    Elm_Transit  *transit[8];
1546    Evas_Object *obj;
1547    Evas_Coord x, w, h;       // for normal style animation data
1548    double stroke_width;
1549    double shrink;
1550    double shift;
1551    Ecore_Job *pulse_job;
1552    Eina_Bool continued : 1;
1553    Eina_Bool pulse : 1;
1554 } vg_progressbar;
1555
1556 static void
1557 transit0_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1558 {
1559    vg_progressbar *vd = data;
1560    vd->transit[0] = NULL;
1561 }
1562
1563 static void
1564 transit1_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1565 {
1566    vg_progressbar *vd = data;
1567    vd->transit[1] = NULL;
1568 }
1569
1570 static void
1571 transit2_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1572 {
1573    vg_progressbar *vd = data;
1574    vd->transit[2] = NULL;
1575 }
1576
1577 static void
1578 transit3_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1579 {
1580    vg_progressbar *vd = data;
1581    vd->transit[3] = NULL;
1582 }
1583
1584 static void
1585 transit4_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1586 {
1587    vg_progressbar *vd = data;
1588    vd->transit[4] = NULL;
1589 }
1590
1591 static void
1592 transit5_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1593 {
1594    vg_progressbar *vd = data;
1595    vd->transit[5] = NULL;
1596 }
1597
1598 static void
1599 transit6_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1600 {
1601    vg_progressbar *vd = data;
1602    vd->transit[6] = NULL;
1603 }
1604
1605 static void
1606 _pulse_stop(vg_progressbar *vd)
1607 {
1608    int i;
1609
1610    vd->pulse = EINA_FALSE;
1611
1612    for (i = 0; i < 8 ; i++)
1613      {
1614         elm_transit_del(vd->transit[i]);
1615         vd->transit[i] = NULL;
1616      }
1617
1618    // delete if any pul_job is scheduled.
1619    if (vd->pulse_job)
1620      ecore_job_del(vd->pulse_job);
1621    vd->pulse_job = NULL;
1622 }
1623
1624 static void
1625 progressbar_hide_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
1626                     void *event_info EINA_UNUSED)
1627 {
1628    _pulse_stop(data);
1629 }
1630
1631 static void
1632 transit_progressbar_normal_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1633 {
1634    vg_progressbar *vd = effect;
1635
1636    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
1637    evas_vg_shape_reset(vd->shape[1]);
1638    Evas_Coord start_width = vd->x + vd->h;
1639    evas_vg_shape_append_rect(vd->shape[1], 0, 0, start_width + (vd->w - start_width)* progress, vd->h, vd->h/2, vd->h/2);
1640
1641    evas_vg_node_color_set(vd->shape[2], 255, 255, 255, 255);
1642    evas_vg_shape_reset(vd->shape[2]);
1643    Evas_Coord delta_width = (vd->w - vd->x - vd->h) * progress;
1644    evas_vg_shape_append_rect(vd->shape[2], vd->x, 0, vd->h + delta_width, vd->h, vd->h/2, vd->h/2);
1645
1646 }
1647
1648 static void
1649 transit_progressbar_normal_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1650 {
1651    vg_progressbar *vd = effect;
1652    evas_vg_node_color_set(vd->shape[2], 255, 255, 255, 255);
1653    evas_vg_shape_reset(vd->shape[2]);
1654    Evas_Coord delta_move =  (vd->w - vd->x - vd->h) * progress;
1655    evas_vg_shape_append_rect(vd->shape[2], vd->x + delta_move, 0, vd->w - vd->x - delta_move, vd->h, vd->h/2, vd->h/2);
1656 }
1657
1658 static void
1659 transit_progressbar_normal_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1660 {
1661    vg_progressbar *vd = effect;
1662    int c = 255 - 255*progress;
1663    evas_vg_node_color_set(vd->shape[2], c, c, c, c);
1664 }
1665
1666 static void
1667 _transit_progressbar_normal_animation_finished(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
1668 {
1669    vg_progressbar *vd = effect;
1670    vd->transit[2] = NULL;
1671    if (vd->continued)
1672      vd->continued = EINA_FALSE;
1673    else
1674      elm_layout_signal_emit(vd->obj, "elm,action,animation,finished", "elm");
1675 }
1676
1677 static void
1678 progressbar_normal_bg_resize_cb(void *data , Evas *e EINA_UNUSED,
1679                                 Evas_Object *obj EINA_UNUSED,
1680                                 void *event_info EINA_UNUSED)
1681 {
1682    Evas_Coord x, y, w, h;
1683    vg_progressbar *vd = data;
1684    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1685    evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
1686    evas_vg_shape_reset(vd->shape[0]);
1687    evas_vg_shape_append_rect(vd->shape[0], 0, 0, w, h, h/2, h/2);
1688 }
1689
1690 static void
1691 progressbar_normal_fg_resize_cb(void *data, Evas *e EINA_UNUSED,
1692                                 Evas_Object *obj EINA_UNUSED,
1693                                 void *event_info EINA_UNUSED)
1694 {
1695    Evas_Coord x, y, w, h;
1696    static double ease_out_factor[4] = {0.25, 0.46, 0.45, 1.0};
1697    vg_progressbar *vd = data;
1698    evas_object_geometry_get(vd->vg[1], &x, &y, &w, &h);
1699    if (w < 2) return;
1700
1701    if (vd->w >= w) vd->x = 0;
1702    else vd->x = vd->w - vd->h;
1703    vd->w = w;
1704    vd->h = h;
1705    elm_transit_del(vd->transit[0]);
1706    vd->transit[0] = elm_transit_add();
1707    elm_transit_effect_add(vd->transit[0], transit_progressbar_normal_op1, vd, transit0_progress_del_cb);
1708    elm_transit_tween_mode_set(vd->transit[0], ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE);
1709    elm_transit_tween_mode_factor_n_set(vd->transit[0], 4, ease_out_factor);
1710    elm_transit_duration_set(vd->transit[0], 0.8);
1711    elm_transit_objects_final_state_keep_set(vd->transit[0], EINA_TRUE);
1712
1713    elm_transit_del(vd->transit[1]);
1714    vd->transit[1] = elm_transit_add();
1715    elm_transit_effect_add(vd->transit[1], transit_progressbar_normal_op2, vd, transit1_progress_del_cb);
1716    elm_transit_tween_mode_set(vd->transit[1], ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE);
1717    elm_transit_tween_mode_factor_n_set(vd->transit[1], 4, ease_out_factor);
1718    elm_transit_duration_set(vd->transit[1], 0.7);
1719    elm_transit_objects_final_state_keep_set(vd->transit[1], EINA_TRUE);
1720
1721    if (vd->transit[2]) vd->continued = EINA_TRUE;
1722
1723    elm_transit_del(vd->transit[2]);
1724    vd->transit[2] = elm_transit_add();
1725    elm_transit_effect_add(vd->transit[2], transit_progressbar_normal_op3, vd, _transit_progressbar_normal_animation_finished);
1726    elm_transit_tween_mode_set(vd->transit[2], ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE);
1727    elm_transit_tween_mode_factor_n_set(vd->transit[2], 4, ease_out_factor);
1728    elm_transit_duration_set(vd->transit[2], 0.3);
1729    elm_transit_objects_final_state_keep_set(vd->transit[2], EINA_TRUE);
1730
1731    elm_transit_chain_transit_add(vd->transit[0], vd->transit[1]);
1732    elm_transit_chain_transit_add(vd->transit[1], vd->transit[2]);
1733
1734    elm_transit_go(vd->transit[0]);
1735
1736 }
1737
1738 static void
1739 _progressbar_normal_style(vg_progressbar *vd)
1740 {
1741    Efl_VG *root;
1742    int i;
1743    Evas *e = evas_object_evas_get(vd->obj);
1744
1745    for(i=0; i < 3; i++)
1746      {
1747         vd->vg[i] = evas_object_vg_add(e);
1748         root = evas_object_vg_root_node_get(vd->vg[i]);
1749         vd->shape[i] = evas_vg_shape_add(root);
1750      }
1751
1752    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1753                                   progressbar_normal_bg_resize_cb, vd);
1754    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
1755                                   progressbar_normal_fg_resize_cb, vd);
1756
1757    //unset
1758    elm_object_part_content_unset(vd->obj, "tizen_vg_shape1");
1759    elm_object_part_content_unset(vd->obj, "tizen_vg_shape2");
1760    elm_object_part_content_unset(vd->obj, "tizen_vg_shape3");
1761
1762    elm_object_part_content_set(vd->obj, "tizen_vg_shape1", vd->vg[0]);
1763    elm_object_part_content_set(vd->obj, "tizen_vg_shape2", vd->vg[1]);
1764    elm_object_part_content_set(vd->obj, "tizen_vg_shape3", vd->vg[2]);
1765 }
1766
1767 static void
1768 progressbar_process_resize_cb(void *data , Evas *e EINA_UNUSED,
1769                                 Evas_Object *obj EINA_UNUSED,
1770                                 void *event_info EINA_UNUSED)
1771 {
1772    Evas_Coord x, y, w, h,i;
1773    vg_progressbar *vd = data;
1774    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1775    for(i=0; i < 3; i++)
1776      {
1777         evas_vg_shape_reset(vd->shape[i]);
1778         evas_vg_shape_stroke_color_set(vd->shape[i], 255, 255, 255, 255);
1779         evas_vg_shape_append_arc(vd->shape[i], 0, 0, w - vd->shrink, h - vd->shrink, 90.5, -1);
1780         evas_vg_shape_stroke_width_set(vd->shape[i], vd->stroke_width);
1781         evas_vg_node_origin_set(vd->shape[i], vd->shift, vd->shift);
1782      }
1783 }
1784
1785 static void
1786 transit_progressbar_process_A_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1787 {
1788    vg_progressbar *vd = effect;
1789    Evas_Coord x, y, w, h;
1790    double s_a = 90.5, e_a = 90.5, s_l = -1 , e_l = -126;
1791    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1792    double start_angle = s_a + (e_a - s_a) * progress;
1793    double sweep_length = s_l + (e_l - s_l) * progress;
1794    evas_vg_shape_reset(vd->shape[2]);
1795    evas_vg_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1796 }
1797
1798 static void
1799 transit_progressbar_process_A_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1800 {
1801    vg_progressbar *vd = effect;
1802    Evas_Coord x, y, w, h;
1803    double s_a = 90.5, e_a = -170, s_l = -126 , e_l = -100;
1804    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1805    double start_angle = s_a + (e_a - s_a) * progress;
1806    double sweep_length = s_l + (e_l - s_l) * progress;
1807    evas_vg_shape_reset(vd->shape[2]);
1808    evas_vg_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1809 }
1810
1811 static void
1812 transit_progressbar_process_A_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1813 {
1814    vg_progressbar *vd = effect;
1815    Evas_Coord x, y, w, h;
1816    double s_a = -170, e_a = -269.5, s_l = -100 , e_l = -1;
1817    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1818    double start_angle = s_a + (e_a - s_a) * progress;
1819    double sweep_length = s_l + (e_l - s_l) * progress;
1820    evas_vg_shape_reset(vd->shape[2]);
1821    evas_vg_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1822 }
1823
1824 static void
1825 transit_progressbar_process_B_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1826 {
1827    vg_progressbar *vd = effect;
1828    Evas_Coord x, y, w, h;
1829    double s_a = 90.5, e_a = 90.5, s_l = -1 , e_l = -172.8;
1830    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1831    double start_angle = s_a + (e_a - s_a) * progress;
1832    double sweep_length = s_l + (e_l - s_l) * progress;
1833    evas_vg_shape_reset(vd->shape[1]);
1834    evas_vg_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1835 }
1836
1837 static void
1838 transit_progressbar_process_B_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1839 {
1840    vg_progressbar *vd = effect;
1841    Evas_Coord x, y, w, h;
1842    double s_a = 90.5, e_a = -129.7, s_l = -172.8 , e_l = -140.3;
1843    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1844    double start_angle = s_a + (e_a - s_a) * progress;
1845    double sweep_length = s_l + (e_l - s_l) * progress;
1846    evas_vg_shape_reset(vd->shape[1]);
1847    evas_vg_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1848 }
1849
1850 static void
1851 transit_progressbar_process_B_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1852 {
1853    vg_progressbar *vd = effect;
1854    Evas_Coord x, y, w, h;
1855    double s_a = -129.7, e_a = -269.5, s_l = -140.3 , e_l = -1;
1856    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1857    double start_angle = s_a + (e_a - s_a) * progress;
1858    double sweep_length = s_l + (e_l - s_l) * progress;
1859    evas_vg_shape_reset(vd->shape[1]);
1860    evas_vg_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1861 }
1862
1863 static void
1864 transit_progressbar_process_C_op1(Elm_Transit_Effect *effect EINA_UNUSED, Elm_Transit *transit EINA_UNUSED, double progress EINA_UNUSED)
1865 {
1866 }
1867
1868 static void
1869 transit_progressbar_process_C_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1870 {
1871    vg_progressbar *vd = effect;
1872    Evas_Coord x, y, w, h;
1873    double s_a = 89.5, e_a = -270.5, s_l = -1 , e_l = -1;
1874    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1875    double start_angle = s_a + (e_a - s_a) * progress;
1876    double sweep_length = s_l + (e_l - s_l) * progress;
1877    evas_vg_shape_reset(vd->shape[0]);
1878    evas_vg_shape_append_arc(vd->shape[0], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1879 }
1880
1881 static void _transit_progressbar_process_end(Elm_Transit_Effect *effect, Elm_Transit *transit);
1882
1883 static void
1884 _progressbar_process_pulse_start_helper(void *data)
1885 {
1886    vg_progressbar *vd = data;
1887
1888    vd->pulse_job = NULL;
1889
1890    // For Layer A animation
1891    elm_transit_del(vd->transit[0]);
1892    vd->transit[0] = elm_transit_add();
1893    elm_transit_effect_add(vd->transit[0], transit_progressbar_process_A_op1, vd, transit0_progress_del_cb);
1894    elm_transit_duration_set(vd->transit[0], 0.35);
1895    elm_transit_objects_final_state_keep_set(vd->transit[0], EINA_TRUE);
1896
1897    elm_transit_del(vd->transit[1]);
1898    vd->transit[1] = elm_transit_add();
1899    elm_transit_effect_add(vd->transit[1], transit_progressbar_process_A_op2, vd, transit1_progress_del_cb);
1900    elm_transit_duration_set(vd->transit[1], 0.65);
1901    elm_transit_objects_final_state_keep_set(vd->transit[1], EINA_TRUE);
1902
1903    elm_transit_del(vd->transit[2]);
1904    vd->transit[2] = elm_transit_add();
1905    elm_transit_effect_add(vd->transit[2], transit_progressbar_process_A_op3, vd, transit2_progress_del_cb);
1906    elm_transit_duration_set(vd->transit[2], 0.25);
1907    elm_transit_objects_final_state_keep_set(vd->transit[2], EINA_TRUE);
1908
1909    elm_transit_chain_transit_add(vd->transit[0], vd->transit[1]);
1910    elm_transit_chain_transit_add(vd->transit[1], vd->transit[2]);
1911
1912    elm_transit_go(vd->transit[0]);
1913
1914    // For Layer B Animation
1915    elm_transit_del(vd->transit[3]);
1916    vd->transit[3] = elm_transit_add();
1917    elm_transit_effect_add(vd->transit[3], transit_progressbar_process_B_op1, vd, transit3_progress_del_cb);
1918    elm_transit_duration_set(vd->transit[3], 0.48);
1919    elm_transit_objects_final_state_keep_set(vd->transit[3], EINA_TRUE);
1920
1921    elm_transit_del(vd->transit[4]);
1922    vd->transit[4] = elm_transit_add();
1923    elm_transit_effect_add(vd->transit[4], transit_progressbar_process_B_op2, vd, transit4_progress_del_cb);
1924    elm_transit_duration_set(vd->transit[4], 0.52);
1925    elm_transit_objects_final_state_keep_set(vd->transit[4], EINA_TRUE);
1926
1927    elm_transit_del(vd->transit[5]);
1928    vd->transit[5] = elm_transit_add();
1929    elm_transit_effect_add(vd->transit[5], transit_progressbar_process_B_op3, vd, transit5_progress_del_cb);
1930    elm_transit_duration_set(vd->transit[5], 0.33);
1931    elm_transit_objects_final_state_keep_set(vd->transit[5], EINA_TRUE);
1932
1933    elm_transit_chain_transit_add(vd->transit[3], vd->transit[4]);
1934    elm_transit_chain_transit_add(vd->transit[4], vd->transit[5]);
1935
1936    elm_transit_go(vd->transit[3]);
1937
1938    // This transition is just a dummy one
1939    // because transit_go_in dosen't guarentee the exact time transition will start.
1940    // this fixed the tail dot animation delay issue in 1st frame.
1941    elm_transit_del(vd->transit[6]);
1942    vd->transit[6] = elm_transit_add();
1943    elm_transit_effect_add(vd->transit[6], transit_progressbar_process_C_op1, vd, transit6_progress_del_cb);
1944    elm_transit_duration_set(vd->transit[6], .54);
1945    elm_transit_objects_final_state_keep_set(vd->transit[6], EINA_TRUE);
1946    elm_transit_go_in(vd->transit[6], .54);
1947
1948    // For Layer C Animation
1949    elm_transit_del(vd->transit[7]);
1950    vd->transit[7] = elm_transit_add();
1951    elm_transit_effect_add(vd->transit[7], transit_progressbar_process_C_op2, vd, _transit_progressbar_process_end);
1952    elm_transit_duration_set(vd->transit[7], 0.85);
1953    elm_transit_objects_final_state_keep_set(vd->transit[7], EINA_TRUE);
1954
1955    elm_transit_chain_transit_add(vd->transit[6], vd->transit[7]);
1956
1957    elm_transit_go(vd->transit[6]);
1958 }
1959
1960 static void
1961 _transit_progressbar_process_end(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
1962 {
1963    vg_progressbar *vd = effect;
1964    vd->transit[7] = NULL;
1965
1966    // restart the pulse
1967    if (vd->pulse)
1968      vd->pulse_job = ecore_job_add(_progressbar_process_pulse_start_helper, vd);
1969 }
1970
1971 static void
1972 _progressbar_process_pulse_start(void *data,
1973                                  Evas_Object *obj EINA_UNUSED,
1974                                  const char *emission EINA_UNUSED,
1975                                  const char *source EINA_UNUSED)
1976 {
1977    vg_progressbar *vd = data;
1978    if (vd->pulse) return;
1979
1980    vd->pulse = EINA_TRUE;
1981    _progressbar_process_pulse_start_helper(data);
1982 }
1983
1984 static void
1985 _progressbar_process_pulse_stop(void *data,
1986                                 Evas_Object *obj EINA_UNUSED,
1987                                 const char *emission EINA_UNUSED,
1988                                 const char *source EINA_UNUSED)
1989 {
1990    _pulse_stop(data);
1991 }
1992
1993 static void
1994 progressbar_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
1995                    void *event_info EINA_UNUSED)
1996 {
1997    vg_progressbar *vd = evas_object_data_get(obj, vg_key);
1998
1999    _pulse_stop(vd);
2000    evas_object_data_set(obj, vg_key, NULL);
2001    elm_object_signal_callback_del(vd->obj, "elm,state,pulse,start",
2002                                   "*", _progressbar_process_pulse_start);
2003    elm_object_signal_callback_del(vd->obj, "elm,state,pulse,stop",
2004                                   "*", _progressbar_process_pulse_stop);
2005    evas_object_del(vd->vg[0]);
2006    evas_object_del(vd->vg[1]);
2007    evas_object_del(vd->vg[2]);
2008    free(vd);
2009 }
2010
2011 static void
2012 _progressbar_process_style(vg_progressbar *vd)
2013 {
2014    Efl_VG *root;
2015    int i;
2016    Evas *e = evas_object_evas_get(vd->obj);
2017
2018    for(i=0; i < 3; i++)
2019      {
2020         vd->vg[i] = evas_object_vg_add(e);
2021         root = evas_object_vg_root_node_get(vd->vg[i]);
2022         vd->shape[i] = evas_vg_shape_add(root);
2023         evas_vg_shape_stroke_color_set(vd->shape[i], 255, 255, 255, 255);
2024         evas_vg_shape_stroke_cap_set(vd->shape[i], EFL_GFX_CAP_ROUND);
2025      }
2026
2027    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
2028                                   progressbar_process_resize_cb, vd);
2029
2030    elm_object_part_content_set(vd->obj, "tizen_vg_shape1", vd->vg[0]);
2031    elm_object_part_content_set(vd->obj, "tizen_vg_shape2", vd->vg[1]);
2032    elm_object_part_content_set(vd->obj, "tizen_vg_shape3", vd->vg[2]);
2033
2034    elm_object_signal_callback_add(vd->obj, "elm,state,pulse,start",
2035                                   "*", _progressbar_process_pulse_start, vd);
2036
2037    elm_object_signal_callback_add(vd->obj, "elm,state,pulse,stop",
2038                                    "*", _progressbar_process_pulse_stop, vd);
2039
2040 }
2041
2042 void
2043 tizen_vg_progressbar_set(Elm_Progressbar *obj)
2044 {
2045    vg_progressbar *vd = evas_object_data_get(obj, vg_key);
2046    if (vd)
2047      {
2048         if (vd->vg[0]) evas_object_del(vd->vg[0]);
2049         if (vd->vg[1]) evas_object_del(vd->vg[1]);
2050         if (vd->vg[2]) evas_object_del(vd->vg[2]);
2051         vd->x = 0;
2052      }
2053
2054    //Apply vector ux only theme has "vector_ux"
2055    const char *str = elm_layout_data_get(obj, "vector_ux");
2056    if (!str)
2057      {
2058         if (!vd) return;
2059
2060         _pulse_stop(vd);
2061         evas_object_data_set(vd->obj, vg_key, NULL);
2062         evas_object_event_callback_del(vd->obj, EVAS_CALLBACK_DEL,
2063                                        progressbar_del_cb);
2064         evas_object_event_callback_del(vd->obj, EVAS_CALLBACK_HIDE,
2065                                        progressbar_hide_cb);
2066         elm_object_signal_callback_del(vd->obj, "elm,state,pulse,start",
2067                                        "*", _progressbar_process_pulse_start);
2068
2069         elm_object_signal_callback_del(vd->obj, "elm,state,pulse,stop",
2070                                        "*", _progressbar_process_pulse_stop);
2071         free(vd);
2072
2073         return;
2074      }
2075
2076    if (!vd)
2077      {
2078         vd = calloc(1, sizeof(vg_progressbar));
2079         if (!vd)
2080           {
2081              ERR("Failed to allocate vector graphics data memory");
2082              return;
2083           }
2084         evas_object_data_set(obj, vg_key, vd);
2085         vd->obj = obj;
2086         // callback to free vd data
2087         evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_DEL,
2088                                        progressbar_del_cb, NULL);
2089         evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_HIDE,
2090                                        progressbar_hide_cb, vd);
2091      }
2092
2093    if (!strcmp(str, "default"))
2094      {
2095         _progressbar_normal_style(vd);
2096         return;
2097      }
2098    if (!strcmp(str, "process_large") ||
2099        !strcmp(str, "process_medium") ||
2100        !strcmp(str, "process_small"))
2101      {
2102         vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 5);
2103         if (!strcmp(str, "process_medium"))
2104           {
2105              vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 3);
2106           }
2107         if (!strcmp(str, "process_small"))
2108           {
2109              vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 2);
2110           }
2111         vd->shrink = 2 * vd->stroke_width;
2112         vd->shift = vd->stroke_width + 0.5;
2113         _progressbar_process_style(vd);
2114         return;
2115      }
2116 }
2117
2118 /////////////////////////////////////////////////////////////////////////
2119 /* Slider */
2120 /////////////////////////////////////////////////////////////////////////
2121
2122 typedef struct vg_slider_s
2123 {
2124    Evas_Object *vg[7];
2125    Efl_VG_Shape *shape[7];
2126    Evas_Object *obj;
2127    Evas_Object *popup;
2128    Eina_Stringshare *style;
2129 } vg_slider;
2130
2131 static int slider_base = 0;
2132 static int slider_level = 1;
2133 static int slider_level2 = 2;
2134 static int slider_level_rest = 3;
2135 static int slider_center = 4;
2136
2137 static void
2138 slider_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
2139               void *event_info EINA_UNUSED)
2140 {
2141    vg_slider *vd = evas_object_data_get(obj, vg_key);
2142    if (vd)
2143      {
2144         evas_object_data_set(obj, vg_key, NULL);
2145         free(vd);
2146      }
2147 }
2148
2149 /* Not Used
2150 static void
2151 _append_circle(Efl_VG *shape, double cx, double cy, double r)
2152 {
2153    evas_vg_shape_reset(shape);
2154    evas_vg_shape_append_circle(shape, cx, cy, r);
2155 }
2156 */
2157
2158 static void
2159 _append_round_rect(Efl_VG *shape, int w, int h)
2160 {
2161    double radius = w/2 > h/2 ? h/2 : w/2;
2162    evas_vg_shape_reset(shape);
2163    evas_vg_shape_append_rect(shape, 0, 0, w, h, radius, radius);
2164 }
2165
2166 static void
2167 slider_base_resize_cb(void *data , Evas *e EINA_UNUSED,
2168                             Evas_Object *obj EINA_UNUSED,
2169                             void *event_info EINA_UNUSED)
2170 {
2171    Evas_Coord w, h;
2172    vg_slider *vd = data;
2173    evas_object_geometry_get(vd->vg[slider_base], NULL, NULL, &w, &h);
2174    _append_round_rect(vd->shape[slider_base], w, h);
2175 }
2176
2177 static void
2178 slider_center_resize_cb(void *data , Evas *e EINA_UNUSED,
2179                             Evas_Object *obj EINA_UNUSED,
2180                             void *event_info EINA_UNUSED)
2181 {
2182    Evas_Coord w, h;
2183    vg_slider *vd = data;
2184    evas_object_geometry_get(vd->vg[slider_center], NULL, NULL, &w, &h);
2185    _append_round_rect(vd->shape[slider_center], w, h);
2186 }
2187
2188 static void
2189 slider_level_resize_cb(void *data , Evas *e EINA_UNUSED,
2190                             Evas_Object *obj EINA_UNUSED,
2191                             void *event_info EINA_UNUSED)
2192 {
2193    Evas_Coord w, h;
2194    vg_slider *vd = data;
2195    evas_object_geometry_get(vd->vg[slider_level], NULL, NULL, &w, &h);
2196    _append_round_rect(vd->shape[slider_level], w, h);
2197 }
2198
2199 static void
2200 slider_level2_resize_cb(void *data , Evas *e EINA_UNUSED,
2201                             Evas_Object *obj EINA_UNUSED,
2202                             void *event_info EINA_UNUSED)
2203 {
2204    Evas_Coord w, h;
2205    vg_slider *vd = data;
2206    evas_object_geometry_get(vd->vg[slider_level2], NULL, NULL, &w, &h);
2207    _append_round_rect(vd->shape[slider_level2], w, h);
2208 }
2209
2210 static void
2211 slider_level_rest_resize_cb(void *data , Evas *e EINA_UNUSED,
2212                             Evas_Object *obj EINA_UNUSED,
2213                             void *event_info EINA_UNUSED)
2214 {
2215    Evas_Coord w, h;
2216    vg_slider *vd = data;
2217    evas_object_geometry_get(vd->vg[slider_level_rest], NULL, NULL, &w, &h);
2218    _append_round_rect(vd->shape[slider_level_rest], w, h);
2219 }
2220
2221 //TIZEN_ONLY(20150915): slider: fix slider's handler bug
2222 static void
2223 slider_unfocused_cb(void *data EINA_UNUSED,
2224                    Evas_Object *obj,
2225                    void *event_info EINA_UNUSED)
2226 {
2227    vg_slider *vd = evas_object_data_get(obj, vg_key);
2228    if (vd->popup)
2229      evas_object_hide(vd->popup);
2230 }
2231 //
2232
2233 static void
2234 _slider_create_handle(vg_slider *vd)
2235 {
2236    Efl_VG *root;
2237    int i;
2238    Evas *e = evas_object_evas_get(vd->obj);
2239    for(i=0; i < 5; i++)
2240      {
2241         vd->vg[i] = evas_object_vg_add(e);
2242         root = evas_object_vg_root_node_get(vd->vg[i]);
2243         vd->shape[i] = evas_vg_shape_add(root);
2244         evas_vg_node_color_set(vd->shape[i], 255, 255, 255, 255);
2245
2246      }
2247    // slider base
2248    evas_object_event_callback_add(vd->vg[slider_base], EVAS_CALLBACK_RESIZE,
2249                                   slider_base_resize_cb, vd);
2250    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape1", vd->vg[slider_base]);
2251
2252    // level
2253    evas_object_event_callback_add(vd->vg[slider_level], EVAS_CALLBACK_RESIZE,
2254                                   slider_level_resize_cb, vd);
2255    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape2", vd->vg[slider_level]);
2256
2257    // level2
2258    evas_object_event_callback_add(vd->vg[slider_level2], EVAS_CALLBACK_RESIZE,
2259                                   slider_level2_resize_cb, vd);
2260    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape3", vd->vg[slider_level2]);
2261
2262    // level rest only for warning type
2263    evas_object_event_callback_add(vd->vg[slider_level_rest], EVAS_CALLBACK_RESIZE,
2264                                   slider_level_rest_resize_cb, vd);
2265    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape4", vd->vg[slider_level_rest]);
2266
2267    // center point
2268    evas_object_event_callback_add(vd->vg[slider_center], EVAS_CALLBACK_RESIZE,
2269                                   slider_center_resize_cb, vd);
2270    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape5", vd->vg[slider_center]);
2271 }
2272
2273 void
2274 tizen_vg_slider_set(Elm_Slider *obj, Evas_Object *popup)
2275 {
2276    vg_slider *vd = evas_object_data_get(obj, vg_key);
2277    if (vd)
2278      {
2279         int i;
2280         for(i=0; i < 7; i++)
2281           if (vd->vg[i]) evas_object_del(vd->vg[i]);
2282         eina_stringshare_del(vd->style);
2283      }
2284
2285    //Apply vector ux only theme has "vector_ux" "on"
2286    const char *str = elm_layout_data_get(obj, "vector_ux");
2287    if (!str) return;
2288
2289    if (!vd)
2290      {
2291         vd = calloc(1, sizeof(vg_slider));
2292         if (!vd)
2293           {
2294              ERR("Failed to allocate vector graphics data memory");
2295              return;
2296           }
2297         evas_object_data_set(obj, vg_key, vd);
2298         vd->obj = obj;
2299         vd->popup = popup;
2300         // callback to free vd data
2301         evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_DEL,
2302                                        slider_del_cb, NULL);
2303
2304         //TIZEN_ONLY(20150915): slider: fix slider's handler bug
2305         evas_object_smart_callback_add(vd->obj, SIG_LAYOUT_UNFOCUSED, slider_unfocused_cb, NULL);
2306         //
2307      }
2308
2309    vd->style = eina_stringshare_add(str);
2310
2311    _slider_create_handle(vd);
2312 }
2313 #endif