572fdde4864b541514f3c509339bb48939600e5f
[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
8 #define EFL_BETA_API_SUPPORT 1
9
10 #ifdef TIZEN_VECTOR_UX
11
12 static const char *vg_key = "_tizen_vg";
13
14
15 /*
16   This api is required for tizen2.3 compatibility.
17   As elm_app_base_scale_set() in introduced in tizen 2.4 and
18   used in the calculation of scaling. For appliaction's thats
19   written on tizen2.3 the default value is 1 , but we need 1.7
20   for qHD display hence the hack.
21   From tizen2.4 onwards its the application responsibility to set
22   the base scale properly.
23 */
24 static double
25 ELM_VG_SCALE_SIZE(Evas_Object* obj, double x)
26 {
27    if (elm_app_base_scale_get() > 1)
28      return (ELM_SCALE_SIZE(x) * elm_object_scale_get(obj));
29    else
30      return (((x) / 1.7) * elm_config_scale_get() * elm_object_scale_get(obj));
31 }
32 /////////////////////////////////////////////////////////////////////////
33 /* Radio */
34 /////////////////////////////////////////////////////////////////////////
35 typedef struct vg_radio_s
36 {
37    Evas_Object *vg[3];       //0: outline, 1: center circle, 2: iconic circle
38    Efl_VG_Shape *shape[4];   //0: outline, 1: center circle, 2: iconic outline, 3: iconic circle
39    Elm_Transit *transit;
40    Evas_Object *obj;
41    Eina_Bool init : 1;
42 } vg_radio;
43
44 static int
45 adjust_radius(int radius)
46 {
47    //FIXME: remove once ector backend
48    // draws perfect circle for odd radius value.
49    if (radius & 1) radius -= 1;
50    return radius;
51 }
52
53 static void
54 transit_radio_op(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED,
55                  double progress)
56 {
57    vg_radio *vd = effect;
58
59    Evas_Coord w, h;
60    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
61    double center_x = ((double)w / 2);
62    double center_y = ((double)h / 2);
63
64    if (elm_radio_selected_object_get(vd->obj) != vd->obj)
65      progress = 1 - progress;
66
67    int radius = (center_x < center_y ? center_x : center_y)
68       - (2 * ELM_VG_SCALE_SIZE(vd->obj, 1.5));
69
70    //Iconic Circle (Outline)
71    evas_vg_shape_stroke_width_set(vd->shape[2],
72                                   (1 + progress * ELM_VG_SCALE_SIZE(vd->obj, 1.5)));
73
74    //Iconic Circle (Center)
75    radius = radius * 0.6 * progress;
76    radius = adjust_radius(radius);
77    evas_vg_shape_shape_reset(vd->shape[3]);
78    evas_vg_shape_shape_append_circle(vd->shape[3], center_x, center_y, radius);
79 }
80
81 static void
82 transit_radio_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
83 {
84    vg_radio *vd = data;
85    vd->transit = NULL;
86 }
87
88 static void
89 radio_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
90                  void *event_info EINA_UNUSED)
91 {
92    vg_radio *vd = data;
93
94    //Circle Effect
95    elm_transit_del(vd->transit);
96    vd->transit = elm_transit_add();
97    elm_transit_effect_add(vd->transit, transit_radio_op, vd,
98                           NULL);
99    elm_transit_del_cb_set(vd->transit, transit_radio_del_cb, vd);
100    elm_transit_tween_mode_set(vd->transit,
101                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
102    elm_transit_duration_set(vd->transit, 0.2);
103    elm_transit_go(vd->transit);
104 }
105
106 static void
107 radio_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
108              void *event_info EINA_UNUSED)
109 {
110    vg_radio *vd = data;
111    evas_object_data_set(vd->obj, vg_key, NULL);
112    evas_object_smart_callback_del(vd->obj, "changed",
113                                   radio_changed_cb);
114    elm_transit_del(vd->transit);
115    evas_object_del(vd->vg[1]);
116    evas_object_del(vd->vg[2]);
117    free(vd);
118 }
119
120 static void
121 radio_init(vg_radio *vd)
122 {
123    if (vd->init) return;
124    vd->init = EINA_TRUE;
125
126    //Outline Shape
127    vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
128    evas_vg_shape_stroke_color_set(vd->shape[0], 255, 255, 255, 255);
129    evas_vg_shape_stroke_width_set(vd->shape[0], ELM_VG_SCALE_SIZE(vd->obj, 1));
130
131    //Center Circle
132    vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
133    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
134
135    //Iconic Circle (Outline)
136    vd->shape[2] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
137    evas_vg_shape_stroke_color_set(vd->shape[2], 255, 255, 255, 255);
138    evas_vg_shape_stroke_width_set(vd->shape[2], 1 + ELM_VG_SCALE_SIZE(vd->obj, 1.5));
139
140    //Iconic Circle (Center Point)
141    vd->shape[3] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
142    evas_vg_node_color_set(vd->shape[3], 255, 255, 255, 255);
143 }
144
145 static void
146 radio_base_resize_cb(void *data, Evas *e EINA_UNUSED,
147                      Evas_Object *obj EINA_UNUSED,
148                      void *event_info EINA_UNUSED)
149 {
150    vg_radio *vd = data;
151
152    radio_init(vd);
153
154    Evas_Coord w, h;
155    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
156    Evas_Coord center_x = (w / 2);
157    Evas_Coord center_y = (h / 2);
158
159    int radius = (center_x < center_y ? center_x : center_y)
160       -(2 * ELM_VG_SCALE_SIZE(vd->obj, 1.5));
161
162    radius = adjust_radius(radius);
163
164    //Outline
165    evas_vg_shape_shape_reset(vd->shape[0]);
166    evas_vg_shape_shape_append_circle(vd->shape[0], center_x, center_y,
167                                      radius);
168
169    if (elm_radio_selected_object_get(vd->obj) != vd->obj) return;
170
171    //Center Circle
172    evas_vg_shape_shape_reset(vd->shape[1]);
173    evas_vg_shape_shape_append_circle(vd->shape[1], center_x, center_y,
174                                      radius);
175
176    //Iconic Circle (Outline)
177    evas_vg_shape_shape_reset(vd->shape[2]);
178    evas_vg_shape_shape_append_circle(vd->shape[2], center_x, center_y,
179                                      radius);
180
181    //Iconic Circle (Center)
182    radius = radius * 0.6;
183    radius = adjust_radius(radius);
184    evas_vg_shape_shape_reset(vd->shape[3]);
185    evas_vg_shape_shape_append_circle(vd->shape[3], center_x, center_y,
186                                      radius);
187 }
188
189 void
190 tizen_vg_radio_set(Elm_Radio *obj)
191 {
192    vg_radio *vd = evas_object_data_get(obj, vg_key);
193    if (vd) evas_object_del(vd->vg[0]);
194
195    //Apply vector ux only theme has "vector_ux"
196    const char *str = elm_layout_data_get(obj, "vector_ux");
197    if (!str) return;
198
199    vd = calloc(1, sizeof(vg_radio));
200    if (!vd)
201      {
202         ERR("Failed to allocate vector graphics data memory");
203         return;
204      }
205    evas_object_data_set(obj, vg_key, vd);
206    evas_object_smart_callback_add(obj, "changed", radio_changed_cb, vd);
207
208    //Vector Graphics Object
209    Evas *e = evas_object_evas_get(obj);
210
211    vd->obj = obj;
212
213    //Outline VG
214    vd->vg[0] = evas_object_vg_add(e);
215    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
216                                   radio_del_cb, vd);
217    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
218                                   radio_base_resize_cb, vd);
219    //Center Circle
220    vd->vg[1] = evas_object_vg_add(e);
221
222    //Iconic Circle
223    vd->vg[2] = evas_object_vg_add(e);
224
225    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
226    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
227    elm_object_part_content_set(obj, "tizen_vg_shape3", vd->vg[2]);
228 }
229
230
231 /////////////////////////////////////////////////////////////////////////
232 /* Check: Favorite */
233 /////////////////////////////////////////////////////////////////////////
234 typedef struct check_favorite_s
235 {
236    Evas_Object *vg[2]; //0: outline, 1: inner body
237    Efl_VG_Shape *shape[2];  //0: outline, 1: inner body
238    Elm_Transit *transit;
239    Evas_Object *obj;
240    Eina_Bool init : 1;
241 } check_favorite;
242
243 static void
244 check_favorite_init(check_favorite *vd)
245 {
246    if (vd->init) return;
247    vd->init = EINA_TRUE;
248
249    //Outline Star
250    vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
251    evas_vg_shape_stroke_color_set(vd->shape[0], 255, 255, 255, 255);
252    evas_vg_shape_stroke_width_set(vd->shape[0], ELM_VG_SCALE_SIZE(vd->obj, 1.5));
253    evas_vg_shape_stroke_join_set(vd->shape[0], EFL_GFX_JOIN_ROUND);
254
255    //Inner Body Star
256    vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
257    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
258 }
259
260 static void
261 check_favorite_shape_do(check_favorite *vd, int idx)
262 {
263    //Input Parameters
264    #define PT_CNT 10
265
266    const double STAR_PT[PT_CNT][2] = {{0, -18}, {6, -6}, {17, -6}, {8, 3},
267                                       {12, 16}, {0, 9}, {-12, 16}, {-8, 3},
268                                       {-17, -6}, {-6, -6}};
269    check_favorite_init(vd);
270
271    Evas_Coord w, h;
272    evas_object_geometry_get(vd->vg[idx], NULL, NULL, &w, &h);
273    double center_x = ((double)w / 2);
274    double center_y = ((double)h / 2);
275
276    //Inner Star Body
277    evas_vg_shape_shape_reset(vd->shape[idx]);
278    evas_vg_shape_shape_append_move_to(vd->shape[idx],
279                                       center_x + ELM_VG_SCALE_SIZE(vd->obj, STAR_PT[0][0]),
280                                       center_y + ELM_VG_SCALE_SIZE(vd->obj, STAR_PT[0][1]));
281    int i;
282    for (i = 1; i < PT_CNT; i++)
283      {
284         evas_vg_shape_shape_append_line_to(vd->shape[idx],
285                                       center_x + ELM_VG_SCALE_SIZE(vd->obj, STAR_PT[i][0]),
286                                       center_y + ELM_VG_SCALE_SIZE(vd->obj, STAR_PT[i][1]));
287      }
288    evas_vg_shape_shape_append_close(vd->shape[idx]);
289
290 }
291
292 static void
293 check_favorite_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
294                             Evas_Object *obj EINA_UNUSED,
295                             void *event_info EINA_UNUSED)
296 {
297    check_favorite *vd = data;
298    check_favorite_shape_do(vd, 0);
299 }
300
301 static void
302 check_favorite_vg2_resize_cb(void *data, Evas *e EINA_UNUSED,
303                              Evas_Object *obj EINA_UNUSED,
304                              void *event_info EINA_UNUSED)
305 {
306    check_favorite *vd = data;
307    if (!elm_check_state_get(vd->obj)) return;
308    check_favorite_shape_do(vd, 1);
309 }
310
311 static void
312 transit_check_favorite_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
313 {
314    check_favorite *vd = data;
315    vd->transit = NULL;
316 }
317
318 static void
319 _check_favorite(check_favorite *vd, double progress)
320 {
321    check_favorite_shape_do(vd, 1);
322
323    if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
324
325    Evas_Coord w, h;
326    evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
327    double center_x = ((double)w / 2);
328    double center_y = ((double)h / 2);
329
330    Eina_Matrix3 m;
331    eina_matrix3_identity(&m);
332    eina_matrix3_translate(&m, center_x, center_y);
333    eina_matrix3_scale(&m, progress, progress);
334    eina_matrix3_translate(&m, -center_x, -center_y);
335    evas_vg_node_transformation_set(vd->shape[1], &m);
336 }
337
338 static void
339 transit_check_favorite_op(Elm_Transit_Effect *effect,
340                           Elm_Transit *transit EINA_UNUSED, double progress)
341 {
342    check_favorite *vd = effect;
343    _check_favorite(vd, progress);
344 }
345
346 static void
347 check_favorite_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
348                                 const char *emission EINA_UNUSED,
349                                 const char *source EINA_UNUSED)
350 {
351    check_favorite *vd = data;
352    if (!source) return;
353    if (strcmp(source, "tizen_vg")) return;
354
355    check_favorite_init(vd);
356
357    Eina_Bool check = elm_check_state_get(obj);
358
359    //Circle Effect
360    elm_transit_del(vd->transit);
361    vd->transit = elm_transit_add();
362    elm_transit_effect_add(vd->transit, transit_check_favorite_op, vd,
363                           NULL);
364    elm_transit_del_cb_set(vd->transit, transit_check_favorite_del_cb, vd);
365    elm_transit_tween_mode_set(vd->transit,
366                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
367    if (check)
368      {
369         elm_transit_duration_set(vd->transit, 0.3);
370         elm_transit_go_in(vd->transit, 0.1);
371      }
372    else
373      {
374         elm_transit_duration_set(vd->transit, 0.3);
375         elm_transit_go(vd->transit);
376      }
377 }
378
379 static void
380 check_favorite_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
381                                const char *emission EINA_UNUSED,
382                                const char *source EINA_UNUSED)
383 {
384    check_favorite *vd = data;
385    if (!source) return;
386    if (strcmp(source, "tizen_vg")) return;
387
388    check_favorite_init(vd);
389
390    _check_favorite(vd, 1.0);
391 }
392
393 static void
394 check_favorite_del_cb(void *data, Evas *e EINA_UNUSED,
395                       Evas_Object *obj EINA_UNUSED,
396                       void *event_info EINA_UNUSED)
397 {
398    check_favorite *vd = data;
399    evas_object_data_set(vd->obj, vg_key, NULL);
400    elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_favorite_state_toggle_cb);
401    elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_favorite_action_toggle_cb);
402    elm_transit_del(vd->transit);
403    evas_object_del(vd->vg[1]);
404    free(vd);
405 }
406
407 void
408 tizen_vg_check_favorite_set(Elm_Check *obj)
409 {
410    check_favorite *vd = calloc(1, sizeof(check_favorite));
411    if (!vd)
412      {
413         ERR("Failed to allocate vector graphics data memory");
414         return;
415      }
416    evas_object_data_set(obj, vg_key, vd);
417    elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_favorite_state_toggle_cb, vd);
418    elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_favorite_action_toggle_cb, vd);
419    vd->obj = obj;
420
421    //Outline Star
422    vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
423    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
424                                   check_favorite_del_cb, vd);
425    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
426                                   check_favorite_vg_resize_cb, vd);
427    //Inner Body Star
428    vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
429    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
430                                   check_favorite_vg2_resize_cb, vd);
431
432    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
433    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
434 }
435
436
437 /////////////////////////////////////////////////////////////////////////
438 /* Check: OnOff */
439 /////////////////////////////////////////////////////////////////////////
440 typedef struct check_onoff_s
441 {
442    Evas_Object *vg[3]; //0: bg, 1: overlapped circle, 2: line-circle
443    Efl_VG_Shape *shape[4];  //0: bg, 1: overlapped circle, 2: line, 3: circle
444    Elm_Transit *transit[3];  //0: circle, 1: line, 2: overlapped circle
445    Evas_Object *obj;
446    Eina_Bool init : 1;
447 } check_onoff;
448
449
450 static void
451 check_onoff_init(check_onoff *vd)
452 {
453    if (vd->init) return;
454    vd->init = EINA_TRUE;
455
456    //BG Circle
457    vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
458    evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
459
460    //Overlap Circle
461    vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
462    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
463
464    //Line Shape
465    vd->shape[2] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
466    evas_vg_shape_stroke_color_set(vd->shape[2], 255, 255, 255, 255);
467    evas_vg_shape_stroke_width_set(vd->shape[2], ELM_VG_SCALE_SIZE(vd->obj, 3));
468    evas_vg_shape_stroke_cap_set(vd->shape[2], EFL_GFX_CAP_ROUND);
469
470    //Circle Shape
471    vd->shape[3] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
472    evas_vg_shape_stroke_color_set(vd->shape[3], 255, 255, 255, 255);
473    evas_vg_shape_stroke_width_set(vd->shape[3], ELM_VG_SCALE_SIZE(vd->obj, 3));
474 }
475
476 static void
477 _check_onoff_circle(check_onoff *vd, double progress)
478 {
479    Evas_Coord w, h;
480    evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
481    double center_x = ((double)w / 2);
482    double center_y = ((double)h / 2);
483
484    evas_vg_shape_shape_reset(vd->shape[3]);
485
486    double radius = (center_x < center_y ? center_x : center_y) -
487                    (ELM_VG_SCALE_SIZE(vd->obj, 3));
488
489    if (elm_check_state_get(vd->obj)) progress = 1 - progress;
490
491    evas_vg_shape_shape_append_circle(vd->shape[3], center_x, center_y,
492                                      radius * progress);
493 }
494
495 static void
496 transit_check_onoff_circle_op(Elm_Transit_Effect *effect,
497                               Elm_Transit *transit EINA_UNUSED, double progress)
498 {
499    check_onoff *vd = effect;
500    _check_onoff_circle(vd, progress);
501 }
502
503 static void
504 transit_check_onoff_circle_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
505 {
506    check_onoff *vd = data;
507    vd->transit[0] = NULL;
508 }
509
510 static void
511 _check_onoff_line(check_onoff *vd, double progress)
512 {
513    Evas_Coord w, h;
514    evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
515    double center_x = ((double)w / 2);
516    double center_y = ((double)h / 2);
517
518    evas_vg_shape_shape_reset(vd->shape[2]);
519
520    if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
521
522    double diff = center_y - ELM_VG_SCALE_SIZE(vd->obj, 3) - 1;
523
524    evas_vg_shape_shape_append_move_to(vd->shape[2], center_x,
525                                       (center_y - (diff * progress)));
526    evas_vg_shape_shape_append_line_to(vd->shape[2], center_x,
527                                       (center_y + (diff * progress)));
528 }
529
530 static void
531 transit_check_onoff_line_op(void *data, Elm_Transit *transit EINA_UNUSED,
532                             double progress)
533 {
534    check_onoff *vd = data;
535    _check_onoff_line(vd, progress);
536 }
537
538 static void
539 transit_check_onoff_line_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
540 {
541    check_onoff *vd = data;
542    vd->transit[1] = NULL;
543 }
544
545 static void
546 _check_onoff_sizing(check_onoff *vd, double progress)
547 {
548    check_onoff_init(vd);
549
550    Evas_Coord w, h;
551    evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
552    double center_x = ((double)w / 2);
553    double center_y = ((double)h / 2);
554
555    if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
556    progress *= 0.3;
557
558    evas_vg_shape_shape_reset(vd->shape[1]);
559    evas_vg_shape_shape_append_circle(vd->shape[1],
560                                      center_x, center_y,
561                                      (0.7 + progress) * center_x);
562 }
563
564 static void
565 transit_check_onoff_sizing_op(void *data, Elm_Transit *transit EINA_UNUSED,
566                               double progress)
567 {
568    check_onoff *vd = data;
569    _check_onoff_sizing(vd, progress);
570 }
571
572 static void
573 transit_check_onoff_sizing_del_cb(void *data,
574                                   Elm_Transit *transit EINA_UNUSED)
575 {
576    check_onoff *vd = data;
577    vd->transit[2] = NULL;
578 }
579
580 static void
581 check_onoff_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
582                              const char *emission EINA_UNUSED,
583                              const char *source EINA_UNUSED)
584 {
585    check_onoff *vd = data;
586    if (!source) return;
587    if (strcmp(source, "tizen_vg")) return;
588
589    check_onoff_init(vd);
590
591    Eina_Bool check = elm_check_state_get(obj);
592
593    //Circle Effect
594    elm_transit_del(vd->transit[0]);
595    vd->transit[0] = elm_transit_add();
596    elm_transit_effect_add(vd->transit[0], transit_check_onoff_circle_op, vd,
597                           NULL);
598    elm_transit_del_cb_set(vd->transit[0], transit_check_onoff_circle_del_cb,
599                           vd);
600    elm_transit_tween_mode_set(vd->transit[0],
601                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
602    if (check)
603      {
604         elm_transit_duration_set(vd->transit[0], 0.1);
605         elm_transit_go(vd->transit[0]);
606      }
607    else
608      {
609         elm_transit_duration_set(vd->transit[0], 0.25);
610         elm_transit_go_in(vd->transit[0], 0.05);
611      }
612
613    //Line Effect
614    elm_transit_del(vd->transit[1]);
615    vd->transit[1] = elm_transit_add();
616    elm_transit_effect_add(vd->transit[1], transit_check_onoff_line_op, vd,
617                           NULL);
618    elm_transit_del_cb_set(vd->transit[1], transit_check_onoff_line_del_cb,
619                           vd);
620    elm_transit_tween_mode_set(vd->transit[1],
621                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
622    if (check)
623      {
624         elm_transit_duration_set(vd->transit[1], 0.25);
625         elm_transit_go_in(vd->transit[1], 0.05);
626      }
627    else
628      {
629         elm_transit_duration_set(vd->transit[1], 0.1);
630         elm_transit_go(vd->transit[1]);
631      }
632
633    //Overlap Circle Sizing Effect
634    elm_transit_del(vd->transit[2]);
635    vd->transit[2] = elm_transit_add();
636    elm_transit_effect_add(vd->transit[2], transit_check_onoff_sizing_op, vd,
637                           NULL);
638    elm_transit_del_cb_set(vd->transit[2], transit_check_onoff_sizing_del_cb,
639                           vd);
640    elm_transit_tween_mode_set(vd->transit[2],
641                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
642    elm_transit_duration_set(vd->transit[2], 0.3);
643    elm_transit_go(vd->transit[2]);
644 }
645
646 static void
647 check_onoff_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
648                             const char *emission EINA_UNUSED,
649                             const char *source EINA_UNUSED)
650 {
651    check_onoff *vd = data;
652    if (!source) return;
653    if (strcmp(source, "tizen_vg")) return;
654
655    check_onoff_init(vd);
656
657    _check_onoff_circle(vd, 1.0);
658    _check_onoff_line(vd, 1.0);
659    _check_onoff_sizing(vd, 1.0);
660 }
661
662 static void
663 check_onoff_del_cb(void *data, Evas *e EINA_UNUSED,
664                    Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
665 {
666    check_onoff *vd = data;
667    evas_object_data_set(vd->obj, vg_key, NULL);
668    elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_onoff_state_toggle_cb);
669    elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_onoff_action_toggle_cb);
670    elm_transit_del(vd->transit[0]);
671    elm_transit_del(vd->transit[1]);
672    elm_transit_del(vd->transit[2]);
673    evas_object_del(vd->vg[1]);
674    free(vd);
675 }
676
677 static void
678 check_onoff_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
679                          Evas_Object *obj EINA_UNUSED,
680                          void *event_info EINA_UNUSED)
681 {
682    check_onoff *vd = data;
683
684    check_onoff_init(vd);
685
686    Evas_Coord w, h;
687    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
688    Evas_Coord center_x = (w / 2);
689    Evas_Coord center_y = (h / 2);
690
691    evas_vg_shape_shape_reset(vd->shape[0]);
692    evas_vg_shape_shape_append_circle(vd->shape[0], center_x, center_y,
693                                      center_x);
694 }
695
696 static void
697 check_onoff_vg2_resize_cb(void *data, Evas *e EINA_UNUSED,
698                           Evas_Object *obj EINA_UNUSED,
699                           void *event_info EINA_UNUSED)
700 {
701    check_onoff *vd = data;
702
703    check_onoff_init(vd);
704
705    Evas_Coord w, h;
706    evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
707    double center_x = ((double)w / 2);
708    double center_y = ((double)h / 2);
709
710    evas_vg_shape_shape_reset(vd->shape[1]);
711    evas_vg_shape_shape_append_circle(vd->shape[1],
712                                      center_x, center_y,
713                                      center_x);
714 }
715
716 static void
717 check_onoff_vg3_resize_cb(void *data, Evas *e EINA_UNUSED,
718                           Evas_Object *obj EINA_UNUSED,
719                           void *event_info EINA_UNUSED)
720 {
721    check_onoff *vd = data;
722
723    check_onoff_init(vd);
724
725    Evas_Coord w, h;
726    evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
727    double center_x = ((double)w / 2);
728    double center_y = ((double)h / 2);
729
730    evas_vg_shape_shape_reset(vd->shape[2]);
731    evas_vg_shape_shape_reset(vd->shape[3]);
732
733    //Line
734    if (elm_check_state_get(vd->obj))
735      {
736         double diff = ELM_VG_SCALE_SIZE(vd->obj, 3) - 1;
737
738         evas_vg_shape_shape_append_move_to(vd->shape[2], center_x, diff);
739         evas_vg_shape_shape_append_line_to(vd->shape[2], center_x, h - diff);
740      }
741    //Circle
742    else
743      {
744         double radius = (center_x < center_y ? center_x : center_y) -
745                         (ELM_VG_SCALE_SIZE(vd->obj, 3));
746         evas_vg_shape_shape_append_circle(vd->shape[3],
747                                           center_x, center_y, radius);
748      }
749 }
750
751 void
752 tizen_vg_check_onoff_set(Elm_Check *obj)
753 {
754    check_onoff *vd = calloc(1, sizeof(check_onoff));
755    if (!vd)
756      {
757         ERR("Failed to allocate vector graphics data memory");
758         return;
759      }
760    evas_object_data_set(obj, vg_key, vd);
761
762    elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_onoff_state_toggle_cb, vd);
763    elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_onoff_action_toggle_cb, vd);
764
765    vd->obj = obj;
766
767    //Base (BG) VG
768    vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
769    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
770                                   check_onoff_del_cb, vd);
771    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
772                                   check_onoff_vg_resize_cb, vd);
773    //Overlapped Circle VG
774    vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
775    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
776                                   check_onoff_vg2_resize_cb, vd);
777    //Line-Circle VG
778    vd->vg[2] = evas_object_vg_add(evas_object_evas_get(obj));
779    evas_object_event_callback_add(vd->vg[2], EVAS_CALLBACK_RESIZE,
780                                   check_onoff_vg3_resize_cb, vd);
781
782    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
783    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
784    elm_object_part_content_set(obj, "tizen_vg_shape3", vd->vg[2]);
785 }
786
787
788
789 /////////////////////////////////////////////////////////////////////////
790 /* Check: Default */
791 /////////////////////////////////////////////////////////////////////////
792 typedef struct check_default_s
793 {
794    Evas_Object *vg[2]; //0: base, 1: line
795    Efl_VG_Shape *shape[4];  //0: outline, 1: bg, 2: left line, 3: right line
796    Elm_Transit *transit[3]; //0: bg color, 1: bg scale, 2: check lines
797    Evas_Object *obj;
798    double left_move_to[2];
799    double left_line_to[2];
800    double right_move_to[2];
801    double right_line_to[2];
802    Eina_Bool init : 1;
803 } check_default;
804
805 static void
806 check_default_init(check_default *vd)
807 {
808    if (vd->init) return;
809    vd->init = EINA_TRUE;
810
811    Efl_VG *base_root = evas_object_vg_root_node_get(vd->vg[0]);
812
813    //Outline Shape
814    vd->shape[0] = evas_vg_shape_add(base_root);
815    evas_vg_shape_stroke_color_set(vd->shape[0], 255, 255, 255, 255);
816    evas_vg_shape_stroke_width_set(vd->shape[0], ELM_VG_SCALE_SIZE(vd->obj, 1.25));
817
818    //BG Shape
819    vd->shape[1] = evas_vg_shape_add(base_root);
820
821    Efl_VG *line_root = evas_object_vg_root_node_get(vd->vg[1]);
822
823    //Left Line Shape
824    vd->shape[2] = evas_vg_shape_add(line_root);
825    evas_vg_shape_stroke_width_set(vd->shape[2], ELM_VG_SCALE_SIZE(vd->obj, 1.75));
826    evas_vg_shape_stroke_color_set(vd->shape[2], 255, 255, 255, 255);
827    evas_vg_shape_stroke_cap_set(vd->shape[2], EFL_GFX_CAP_ROUND);
828
829    //Right Line Shape
830    vd->shape[3] = evas_vg_shape_add(line_root);
831    evas_vg_shape_stroke_width_set(vd->shape[3], ELM_VG_SCALE_SIZE(vd->obj, 1.75));
832    evas_vg_shape_stroke_color_set(vd->shape[3], 255, 255, 255, 255);
833    evas_vg_shape_stroke_cap_set(vd->shape[3], EFL_GFX_CAP_ROUND);
834
835    vd->left_move_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -5);
836    vd->left_move_to[1] = ELM_VG_SCALE_SIZE(vd->obj, 10);
837    vd->left_line_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -8);
838    vd->left_line_to[1] = ELM_VG_SCALE_SIZE(vd->obj, -8);
839
840    vd->right_move_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -5);
841    vd->right_move_to[1] = ELM_VG_SCALE_SIZE(vd->obj, 10);
842    vd->right_line_to[0] = ELM_VG_SCALE_SIZE(vd->obj, 18);
843    vd->right_line_to[1] = ELM_VG_SCALE_SIZE(vd->obj, -18);
844 }
845
846 static void
847 check_default_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
848                            Evas_Object *obj EINA_UNUSED,
849                            void *event_info EINA_UNUSED)
850 {
851    check_default *vd = data;
852
853    check_default_init(vd);
854
855    Evas_Coord w, h;
856    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
857    double center_x = ((double)w / 2);
858    double center_y = ((double)h / 2);
859
860    //Update Outline Shape
861    evas_vg_shape_shape_reset(vd->shape[0]);
862    evas_vg_shape_shape_append_rect(vd->shape[0], 1, 1,
863                                    w - 2, h - 2,
864                                    ELM_VG_SCALE_SIZE(vd->obj, 5),
865                                    ELM_VG_SCALE_SIZE(vd->obj, 5));
866
867    //Update BG Shape
868    evas_vg_shape_shape_reset(vd->shape[1]);
869    evas_vg_shape_shape_append_rect(vd->shape[1], 0, 0, w, h,
870                                    ELM_VG_SCALE_SIZE(vd->obj, 5),
871                                    ELM_VG_SCALE_SIZE(vd->obj, 5));
872    if (elm_check_state_get(vd->obj))
873      evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
874    else
875      evas_vg_node_color_set(vd->shape[1], 0, 0, 0, 0);
876
877    //Update Line Shape
878    if (elm_check_state_get(vd->obj))
879      {
880         //Left
881         evas_vg_shape_shape_reset(vd->shape[2]);
882         evas_vg_shape_shape_append_move_to(vd->shape[2],
883                                            center_x + vd->left_move_to[0],
884                                            center_y + vd->left_move_to[1]);
885         evas_vg_shape_shape_append_line_to(vd->shape[2],
886                                            (center_x + vd->left_move_to[0]) +
887                                            (vd->left_line_to[0]),
888                                            (center_y + vd->left_move_to[1]) +
889                                            (vd->left_line_to[1]));
890         //Right
891         evas_vg_shape_shape_reset(vd->shape[3]);
892         evas_vg_shape_shape_append_move_to(vd->shape[3],
893                                            center_x + vd->right_move_to[0],
894                                            center_y + vd->right_move_to[1]);
895         evas_vg_shape_shape_append_line_to(vd->shape[3],
896                                            (center_x + vd->right_move_to[0]) +
897                                            (vd->right_line_to[0]),
898                                            (center_y + vd->right_move_to[1]) +
899                                            (vd->right_line_to[1]));
900      }
901 }
902
903 static void
904 transit_check_default_bg_color_del_cb(Elm_Transit_Effect *effect,
905                                       Elm_Transit *transit EINA_UNUSED)
906 {
907    check_default *vd = effect;
908    vd->transit[0] = NULL;
909 }
910
911
912 static void
913 _check_default_bg_color(check_default *vd, double progress)
914 {
915    int color;
916
917    if (elm_check_state_get(vd->obj)) color = 255 * progress;
918    else color = 255 * (1 - progress);
919
920    evas_vg_node_color_set(vd->shape[1], color, color, color, color);
921 }
922
923 static void
924 transit_check_default_bg_color_op(Elm_Transit_Effect *effect,
925                                   Elm_Transit *transit EINA_UNUSED,
926                                   double progress)
927 {
928    check_default *vd = effect;
929    _check_default_bg_color(vd, progress);
930 }
931
932 static void
933 transit_check_default_bg_scale_del_cb(Elm_Transit_Effect *effect,
934                                       Elm_Transit *transit EINA_UNUSED)
935 {
936    check_default *vd = effect;
937    vd->transit[1] = NULL;
938 }
939
940 static void
941 _check_default_bg_scale(check_default *vd, double progress)
942 {
943    Evas_Coord w, h;
944    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
945    double center_x = ((double)w / 2);
946    double center_y = ((double)h / 2);
947
948    Eina_Matrix3 m;
949    eina_matrix3_identity(&m);
950    eina_matrix3_translate(&m, center_x, center_y);
951    eina_matrix3_scale(&m, progress, progress);
952    eina_matrix3_translate(&m, -center_x, -center_y);
953    evas_vg_node_transformation_set(vd->shape[1], &m);
954 }
955 static void
956 transit_check_default_bg_scale_op(Elm_Transit_Effect *effect,
957                                   Elm_Transit *transit EINA_UNUSED,
958                                   double progress)
959 {
960    check_default *vd = effect;
961    _check_default_bg_scale(vd, progress);
962 }
963
964 static void
965 transit_check_default_line_del_cb(Elm_Transit_Effect *effect,
966                                   Elm_Transit *transit EINA_UNUSED)
967 {
968    check_default *vd = effect;
969    vd->transit[2] = NULL;
970 }
971
972 static void
973 _check_default_line(check_default *vd, double progress)
974 {
975    Evas_Coord w, h;
976    evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
977    double center_x = ((double)w / 2);
978    double center_y = ((double)h / 2);
979
980    //Update Line Shape
981    if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
982
983    //Left
984    evas_vg_shape_shape_reset(vd->shape[2]);
985    evas_vg_shape_shape_append_move_to(vd->shape[2],
986                                       center_x + vd->left_move_to[0],
987                                       center_y + vd->left_move_to[1]);
988    evas_vg_shape_shape_append_line_to(vd->shape[2],
989                                       (center_x + vd->left_move_to[0]) +
990                                       (vd->left_line_to[0] * progress),
991                                       (center_y + vd->left_move_to[1]) +
992                                       (vd->left_line_to[1] * progress));
993
994    //Right
995    evas_vg_shape_shape_reset(vd->shape[3]);
996    evas_vg_shape_shape_append_move_to(vd->shape[3],
997                                       center_x + vd->right_move_to[0],
998                                       center_y + vd->right_move_to[1]);
999    evas_vg_shape_shape_append_line_to(vd->shape[3],
1000                                       (center_x + vd->right_move_to[0]) +
1001                                       (vd->right_line_to[0] * progress),
1002                                       (center_y + vd->right_move_to[1]) +
1003                                       (vd->right_line_to[1] * progress));
1004 }
1005
1006 static void
1007 transit_check_default_line_op(Elm_Transit_Effect *effect,
1008                               Elm_Transit *transit EINA_UNUSED, double progress)
1009 {
1010    check_default *vd = effect;
1011    _check_default_line(vd, progress);
1012 }
1013
1014 static void
1015 check_default_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
1016                                const char *emission EINA_UNUSED,
1017                                const char *source EINA_UNUSED)
1018 {
1019    check_default *vd = data;
1020    if (!source) return;
1021    if (strcmp(source, "tizen_vg")) return;
1022
1023    check_default_init(vd);
1024
1025    Eina_Bool check = elm_check_state_get(obj);
1026
1027    //BG Color Effect
1028    elm_transit_del(vd->transit[0]);
1029    vd->transit[0] = elm_transit_add();
1030    elm_transit_effect_add(vd->transit[0], transit_check_default_bg_color_op, vd,
1031                           NULL);
1032    elm_transit_del_cb_set(vd->transit[0], transit_check_default_bg_color_del_cb,
1033                           vd);
1034    elm_transit_tween_mode_set(vd->transit[0],
1035                               ELM_TRANSIT_TWEEN_MODE_DECELERATE);
1036
1037    if (check)
1038      {
1039         elm_transit_duration_set(vd->transit[0], 0.3);
1040         elm_transit_go(vd->transit[0]);
1041      }
1042    else
1043      {
1044         elm_transit_duration_set(vd->transit[0], 0.3);
1045         elm_transit_go_in(vd->transit[0], 0.15);
1046      }
1047
1048    //BG Size Effect
1049    elm_transit_del(vd->transit[1]);
1050
1051    if (check)
1052      {
1053         vd->transit[1] = elm_transit_add();
1054         elm_transit_effect_add(vd->transit[1],
1055                                transit_check_default_bg_scale_op, vd, NULL);
1056         elm_transit_del_cb_set(vd->transit[1],
1057                                transit_check_default_bg_scale_del_cb, vd);
1058         elm_transit_tween_mode_set(vd->transit[1],
1059                                    ELM_TRANSIT_TWEEN_MODE_DECELERATE);
1060         elm_transit_duration_set(vd->transit[1], 0.15);
1061         elm_transit_go(vd->transit[1]);
1062      }
1063
1064    //Draw Line
1065    elm_transit_del(vd->transit[2]);
1066
1067    vd->transit[2] = elm_transit_add();
1068    elm_transit_effect_add(vd->transit[2], transit_check_default_line_op, vd,
1069                           NULL);
1070    elm_transit_del_cb_set(vd->transit[2], transit_check_default_line_del_cb,
1071                           vd);
1072    elm_transit_tween_mode_set(vd->transit[2],
1073                               ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL);
1074    elm_transit_duration_set(vd->transit[2], 0.15);
1075
1076    if (check)
1077      elm_transit_go_in(vd->transit[2], 0.15);
1078    else
1079      elm_transit_go(vd->transit[2]);
1080 }
1081
1082 static void
1083 check_default_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
1084                               const char *emission EINA_UNUSED,
1085                               const char *source EINA_UNUSED)
1086 {
1087    check_default *vd = data;
1088    if (!source) return;
1089    if (strcmp(source, "tizen_vg")) return;
1090
1091    check_default_init(vd);
1092
1093    _check_default_bg_color(vd, 1.0);
1094    _check_default_bg_scale(vd, 1.0);
1095    _check_default_line(vd, 1.0);
1096 }
1097
1098 static void
1099 check_default_del_cb(void *data, Evas *e EINA_UNUSED,
1100                      Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1101 {
1102    check_default *vd = data;
1103    evas_object_data_set(vd->obj, vg_key, NULL);
1104    elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_default_state_toggle_cb);
1105    elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_default_action_toggle_cb);
1106    elm_transit_del(vd->transit[0]);
1107    elm_transit_del(vd->transit[1]);
1108    elm_transit_del(vd->transit[2]);
1109    evas_object_del(vd->vg[1]);
1110    free(vd);
1111 }
1112
1113 void
1114 tizen_vg_check_default_set(Elm_Check *obj)
1115 {
1116    check_default *vd = calloc(1, sizeof(check_default));
1117    if (!vd)
1118      {
1119         ERR("Failed to allocate vector graphics data memory");
1120         return;
1121      }
1122    evas_object_data_set(obj, vg_key, vd);
1123
1124    elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_default_state_toggle_cb, vd);
1125    elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_default_action_toggle_cb, vd);
1126
1127    vd->obj = obj;
1128
1129    //Base VG
1130    vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
1131    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1132                                   check_default_del_cb, vd);
1133    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1134                                   check_default_vg_resize_cb, vd);
1135    //Check Line VG
1136    vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
1137
1138    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
1139    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
1140 }
1141
1142 void
1143 tizen_vg_check_set(Elm_Check *obj)
1144 {
1145    check_default *vd = evas_object_data_get(obj, vg_key);
1146    if (vd) evas_object_del(vd->vg[0]);
1147
1148    //Apply vector ux only theme has "vector_ux"
1149    const char *str = elm_layout_data_get(obj, "vector_ux");
1150    if (!str) return;
1151
1152    if (!strcmp(str, "default"))
1153      tizen_vg_check_default_set(obj);
1154    else if (!strcmp(str, "on&off"))
1155      tizen_vg_check_onoff_set(obj);
1156    else if (!strcmp(str, "favorite"))
1157      tizen_vg_check_favorite_set(obj);
1158 }
1159
1160 void
1161 tizen_vg_check_state_set(Elm_Check *obj)
1162 {
1163    // Fix for the state change visual change skips one frame.
1164    // For vector enabled checkbox , state change visual change is handled in the
1165    // code and it depends on "elm,check,action,toggle" signal.
1166    // as edje signal emit is asyn force one more message_signal to make sure
1167    // state change related visual change occurs in the same frame.
1168    edje_object_message_signal_process(elm_layout_edje_get(obj));
1169 }
1170
1171 /////////////////////////////////////////////////////////////////////////
1172 /* Button */
1173 /////////////////////////////////////////////////////////////////////////
1174 typedef struct vg_button_s
1175 {
1176    Evas_Object *vg[2];       //0: base, 1: effect
1177    Efl_VG_Shape *shape[2];   //0: base, 1: effect
1178    Evas_Object *obj;
1179    Eina_Bool init : 1;
1180 } vg_button;
1181
1182 static void
1183 button_init(vg_button *vd)
1184 {
1185    if (vd->init) return;
1186    vd->init = EINA_TRUE;
1187
1188    //Base Shape
1189    Efl_VG *base_root = evas_object_vg_root_node_get(vd->vg[0]);
1190    vd->shape[0] = evas_vg_shape_add(base_root);
1191    evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
1192
1193    //Effect Shape
1194    Efl_VG *effect_root = evas_object_vg_root_node_get(vd->vg[1]);
1195    vd->shape[1] = evas_vg_shape_add(effect_root);
1196    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
1197 }
1198
1199 static void
1200 button_effect_resize_cb(void *data, Evas *e EINA_UNUSED,
1201                         Evas_Object *obj EINA_UNUSED,
1202                         void *event_info EINA_UNUSED)
1203 {
1204    vg_button *vd = data;
1205
1206    button_init(vd);
1207
1208    //Update Effect Shape
1209    Evas_Coord x, y, w, h;
1210    evas_object_geometry_get(vd->vg[1], &x, &y, &w, &h);
1211    evas_vg_shape_shape_reset(vd->shape[1]);
1212    if (w == h)
1213      evas_vg_shape_shape_append_circle(vd->shape[1], w/2, h/2, w/2);
1214    else
1215      evas_vg_shape_shape_append_rect(vd->shape[1], 0, 0, w, h, h/2, h/2);
1216 }
1217
1218 static void
1219 button_base_resize_cb(void *data, Evas *e EINA_UNUSED,
1220                       Evas_Object *obj EINA_UNUSED,
1221                       void *event_info EINA_UNUSED)
1222 {
1223    vg_button *vd = data;
1224
1225    button_init(vd);
1226
1227    //Update Base Shape
1228    Evas_Coord w, h;
1229    evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
1230    evas_vg_shape_shape_reset(vd->shape[0]);
1231    if (w == h)
1232      evas_vg_shape_shape_append_circle(vd->shape[0], w/2, h/2, w/2);
1233    else
1234      evas_vg_shape_shape_append_rect(vd->shape[0], 0, 0, w, h, h/2, h/2);
1235 }
1236
1237 static void
1238 button_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
1239               void *event_info EINA_UNUSED)
1240 {
1241    vg_button *vd = data;
1242    evas_object_data_del(vd->obj, vg_key);
1243    evas_object_del(vd->vg[1]);
1244    free(vd);
1245 }
1246
1247 void
1248 tizen_vg_button_set(Elm_Button *obj)
1249 {
1250    vg_button *vd = evas_object_data_get(obj, vg_key);
1251    if (vd)
1252      {
1253         elm_object_part_content_unset(obj, "tizen_vg_shape");
1254         elm_object_part_content_unset(obj, "tizen_vg_shape2");
1255         evas_object_del(vd->vg[0]);
1256      }
1257
1258    //Apply vector ux only theme has "vector_ux"
1259    const char *str = elm_layout_data_get(obj, "vector_ux");
1260    if (!str) return;
1261
1262    vd = calloc(1, sizeof(vg_button));
1263    if (!vd)
1264      {
1265         ERR("Failed to allocate vector graphics data memory");
1266         return;
1267      }
1268    evas_object_data_set(obj, vg_key, vd);
1269
1270    //Vector Graphics Object
1271    Evas *e = evas_object_evas_get(obj);
1272
1273    vd->obj = obj;
1274
1275    //Base VG
1276    vd->vg[0] = evas_object_vg_add(e);
1277    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1278                                   button_del_cb, vd);
1279    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1280                                   button_base_resize_cb, vd);
1281    //Effect VG
1282    vd->vg[1] = evas_object_vg_add(e);
1283    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
1284                                   button_effect_resize_cb, vd);
1285
1286    elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
1287    elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
1288 }
1289
1290 /////////////////////////////////////////////////////////////////////////
1291 /* Progressbar */
1292 /////////////////////////////////////////////////////////////////////////
1293
1294 typedef struct vg_progressbar_s
1295 {
1296    Evas_Object *vg[3];       //0: base, 1: layer1, 2:layer2
1297    Efl_VG_Shape *shape[3];   //0: base, 1: layer1, 2: layer2
1298    Elm_Transit  *transit;
1299    Evas_Object *obj;
1300    Evas_Coord x, w, h;       // for normal style animation data
1301    double stroke_width;
1302    double shrink;
1303    double shift;
1304 } vg_progressbar;
1305
1306 static void
1307 progressbar_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
1308               void *event_info EINA_UNUSED)
1309 {
1310    vg_progressbar *vd = evas_object_data_get(obj, vg_key);
1311    Elm_Transit *cur_transit = vd->transit;
1312    vd->transit = NULL;
1313    if (cur_transit)
1314      elm_transit_del(cur_transit);
1315    if (vd)
1316      {
1317         evas_object_data_set(obj, vg_key, NULL);
1318         free(vd);
1319      }
1320 }
1321
1322 static void
1323 transit_progressbar_normal_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1324 {
1325    vg_progressbar *vd = effect;
1326
1327    evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
1328    evas_vg_shape_shape_reset(vd->shape[1]);
1329    Evas_Coord start_width = vd->x + vd->h;
1330    evas_vg_shape_shape_append_rect(vd->shape[1], 0, 0, start_width + (vd->w - start_width)* progress, vd->h, vd->h/2, vd->h/2);
1331
1332    evas_vg_node_color_set(vd->shape[2], 255, 255, 255, 255);
1333    evas_vg_shape_shape_reset(vd->shape[2]);
1334    Evas_Coord delta_width = (vd->w - vd->x - vd->h) * progress;
1335    evas_vg_shape_shape_append_rect(vd->shape[2], vd->x, 0, vd->h + delta_width, vd->h, vd->h/2, vd->h/2);
1336
1337 }
1338
1339 static void
1340 transit_progressbar_normal_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1341 {
1342    vg_progressbar *vd = effect;
1343    evas_vg_node_color_set(vd->shape[2], 255, 255, 255, 255);
1344    evas_vg_shape_shape_reset(vd->shape[2]);
1345    Evas_Coord delta_move =  (vd->w - vd->x - vd->h) * progress;
1346    evas_vg_shape_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);
1347 }
1348
1349 static void
1350 transit_progressbar_normal_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1351 {
1352    vg_progressbar *vd = effect;
1353    int c = 255 - 255*progress;
1354    evas_vg_node_color_set(vd->shape[2], c, c, c, c);
1355 }
1356
1357 static void
1358 progressbar_normal_bg_resize_cb(void *data , Evas *e EINA_UNUSED,
1359                                 Evas_Object *obj EINA_UNUSED,
1360                                 void *event_info EINA_UNUSED)
1361 {
1362    Evas_Coord x, y, w, h;
1363    vg_progressbar *vd = data;
1364    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1365    evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
1366    evas_vg_shape_shape_reset(vd->shape[0]);
1367    evas_vg_shape_shape_append_rect(vd->shape[0], 0, 0, w, h, h/2, h/2);
1368 }
1369
1370 static void
1371 progressbar_normal_fg_resize_cb(void *data, Evas *e EINA_UNUSED,
1372                                 Evas_Object *obj EINA_UNUSED,
1373                                 void *event_info EINA_UNUSED)
1374 {
1375    Evas_Coord x, y, w, h;
1376    vg_progressbar *vd = data;
1377    evas_object_geometry_get(vd->vg[1], &x, &y, &w, &h);
1378    if (w < 2) return;
1379
1380    if (vd->w >= w) vd->x = 0;
1381    else vd->x = vd->w - vd->h;
1382    vd->w = w;
1383    vd->h = h;
1384    Elm_Transit *transit1 = elm_transit_add();
1385    elm_transit_object_add(transit1, obj);
1386    elm_transit_effect_add(transit1, transit_progressbar_normal_op1, vd, NULL);
1387    elm_transit_duration_set(transit1, 0.8);
1388    elm_transit_objects_final_state_keep_set(transit1, EINA_TRUE);
1389
1390
1391    Elm_Transit *transit2 = elm_transit_add();
1392    elm_transit_object_add(transit2, obj);
1393    elm_transit_effect_add(transit2, transit_progressbar_normal_op2, vd, NULL);
1394    elm_transit_duration_set(transit2, 0.7);
1395    elm_transit_objects_final_state_keep_set(transit2, EINA_TRUE);
1396
1397    Elm_Transit *transit3 = elm_transit_add();
1398    elm_transit_object_add(transit3, obj);
1399    elm_transit_effect_add(transit3, transit_progressbar_normal_op3, vd, NULL);
1400    elm_transit_duration_set(transit3, 0.3);
1401    elm_transit_objects_final_state_keep_set(transit3, EINA_TRUE);
1402
1403    elm_transit_chain_transit_add(transit1, transit2);
1404    elm_transit_chain_transit_add(transit2, transit3);
1405
1406    elm_transit_go(transit1);
1407
1408 }
1409
1410 static void
1411 _progressbar_normal_style(vg_progressbar *vd)
1412 {
1413    Efl_VG *root;
1414    int i;
1415    Evas *e = evas_object_evas_get(vd->obj);
1416
1417    for(i=0; i < 3; i++)
1418      {
1419         vd->vg[i] = evas_object_vg_add(e);
1420         root = evas_object_vg_root_node_get(vd->vg[i]);
1421         vd->shape[i] = evas_vg_shape_add(root);
1422      }
1423
1424    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1425                                   progressbar_normal_bg_resize_cb, vd);
1426    evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
1427                                   progressbar_normal_fg_resize_cb, vd);
1428
1429    //unset
1430    elm_object_part_content_unset(vd->obj, "tizen_vg_shape1");
1431    elm_object_part_content_unset(vd->obj, "tizen_vg_shape2");
1432    elm_object_part_content_unset(vd->obj, "tizen_vg_shape3");
1433
1434    elm_object_part_content_set(vd->obj, "tizen_vg_shape1", vd->vg[0]);
1435    elm_object_part_content_set(vd->obj, "tizen_vg_shape2", vd->vg[1]);
1436    elm_object_part_content_set(vd->obj, "tizen_vg_shape3", vd->vg[2]);
1437 }
1438
1439 static void
1440 progressbar_process_resize_cb(void *data , Evas *e EINA_UNUSED,
1441                                 Evas_Object *obj EINA_UNUSED,
1442                                 void *event_info EINA_UNUSED)
1443 {
1444    Evas_Coord x, y, w, h,i;
1445    vg_progressbar *vd = data;
1446    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1447    for(i=0; i < 3; i++)
1448      {
1449         evas_vg_shape_shape_reset(vd->shape[i]);
1450         evas_vg_shape_stroke_color_set(vd->shape[i], 255, 255, 255, 255);
1451         evas_vg_shape_shape_append_arc(vd->shape[i], 0, 0, w - vd->shrink, h - vd->shrink, 90.5, -1);
1452         evas_vg_shape_stroke_width_set(vd->shape[i], vd->stroke_width);
1453         evas_vg_node_origin_set(vd->shape[i], vd->shift, vd->shift);
1454      }
1455 }
1456
1457 static void
1458 transit_progressbar_process_A_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1459 {
1460    vg_progressbar *vd = effect;
1461    Evas_Coord x, y, w, h;
1462    double s_a = 90.5, e_a = 90.5, s_l = -1 , e_l = -126;
1463    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1464    double start_angle = s_a + (e_a - s_a) * progress;
1465    double sweep_length = s_l + (e_l - s_l) * progress;
1466    evas_vg_shape_shape_reset(vd->shape[2]);
1467    evas_vg_shape_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1468 }
1469
1470 static void
1471 transit_progressbar_process_A_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1472 {
1473    vg_progressbar *vd = effect;
1474    Evas_Coord x, y, w, h;
1475    double s_a = 90.5, e_a = -170, s_l = -126 , e_l = -100;
1476    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1477    double start_angle = s_a + (e_a - s_a) * progress;
1478    double sweep_length = s_l + (e_l - s_l) * progress;
1479    evas_vg_shape_shape_reset(vd->shape[2]);
1480    evas_vg_shape_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1481 }
1482
1483 static void
1484 transit_progressbar_process_A_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1485 {
1486    vg_progressbar *vd = effect;
1487    Evas_Coord x, y, w, h;
1488    double s_a = -170, e_a = -269.5, s_l = -100 , e_l = -1;
1489    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1490    double start_angle = s_a + (e_a - s_a) * progress;
1491    double sweep_length = s_l + (e_l - s_l) * progress;
1492    evas_vg_shape_shape_reset(vd->shape[2]);
1493    evas_vg_shape_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1494 }
1495
1496 static void
1497 transit_progressbar_process_B_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1498 {
1499    vg_progressbar *vd = effect;
1500    Evas_Coord x, y, w, h;
1501    double s_a = 90.5, e_a = 90.5, s_l = -1 , e_l = -172.8;
1502    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1503    double start_angle = s_a + (e_a - s_a) * progress;
1504    double sweep_length = s_l + (e_l - s_l) * progress;
1505    evas_vg_shape_shape_reset(vd->shape[1]);
1506    evas_vg_shape_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1507 }
1508
1509 static void
1510 transit_progressbar_process_B_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1511 {
1512    vg_progressbar *vd = effect;
1513    Evas_Coord x, y, w, h;
1514    double s_a = 90.5, e_a = -129.7, s_l = -172.8 , e_l = -140.3;
1515    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1516    double start_angle = s_a + (e_a - s_a) * progress;
1517    double sweep_length = s_l + (e_l - s_l) * progress;
1518    evas_vg_shape_shape_reset(vd->shape[1]);
1519    evas_vg_shape_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1520 }
1521
1522 static void
1523 transit_progressbar_process_B_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1524 {
1525    vg_progressbar *vd = effect;
1526    Evas_Coord x, y, w, h;
1527    double s_a = -129.7, e_a = -269.5, s_l = -140.3 , e_l = -1;
1528    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1529    double start_angle = s_a + (e_a - s_a) * progress;
1530    double sweep_length = s_l + (e_l - s_l) * progress;
1531    evas_vg_shape_shape_reset(vd->shape[1]);
1532    evas_vg_shape_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1533 }
1534
1535 static void
1536 transit_progressbar_process_C_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1537 {
1538    vg_progressbar *vd = effect;
1539    Evas_Coord x, y, w, h;
1540    double s_a = 89.5, e_a = -270.5, s_l = -1 , e_l = -1;
1541    evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1542    double start_angle = s_a + (e_a - s_a) * progress;
1543    double sweep_length = s_l + (e_l - s_l) * progress;
1544    evas_vg_shape_shape_reset(vd->shape[0]);
1545    evas_vg_shape_shape_append_arc(vd->shape[0], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1546 }
1547
1548 static void _transit_progreassbar_process_end(Elm_Transit_Effect *effect, Elm_Transit *transit);
1549
1550 static void
1551 _progressbar_process_pulse_start_helper(vg_progressbar *vd)
1552 {
1553    // For Layer A animation
1554    Elm_Transit *transit1 = elm_transit_add();
1555    elm_transit_object_add(transit1, vd->obj);
1556    elm_transit_effect_add(transit1, transit_progressbar_process_A_op1, vd, NULL);
1557    elm_transit_duration_set(transit1, 0.35);
1558    elm_transit_objects_final_state_keep_set(transit1, EINA_TRUE);
1559
1560    Elm_Transit *transit2 = elm_transit_add();
1561    elm_transit_object_add(transit2, vd->obj);
1562    elm_transit_effect_add(transit2, transit_progressbar_process_A_op2, vd, NULL);
1563    elm_transit_duration_set(transit2, 0.65);
1564    elm_transit_objects_final_state_keep_set(transit2, EINA_TRUE);
1565
1566    Elm_Transit *transit3 = elm_transit_add();
1567    elm_transit_object_add(transit3, vd->obj);
1568    elm_transit_effect_add(transit3, transit_progressbar_process_A_op3, vd, NULL);
1569    elm_transit_duration_set(transit3, 0.25);
1570    elm_transit_objects_final_state_keep_set(transit3, EINA_TRUE);
1571
1572    elm_transit_chain_transit_add(transit1, transit2);
1573    elm_transit_chain_transit_add(transit2, transit3);
1574
1575    elm_transit_go(transit1);
1576
1577    // For Layer B Animation
1578    transit1 = elm_transit_add();
1579    elm_transit_object_add(transit1, vd->obj);
1580    elm_transit_effect_add(transit1, transit_progressbar_process_B_op1, vd, NULL);
1581    elm_transit_duration_set(transit1, 0.48);
1582    elm_transit_objects_final_state_keep_set(transit1, EINA_TRUE);
1583
1584    transit2 = elm_transit_add();
1585    elm_transit_object_add(transit2, vd->obj);
1586    elm_transit_effect_add(transit2, transit_progressbar_process_B_op2, vd, NULL);
1587    elm_transit_duration_set(transit2, 0.52);
1588    elm_transit_objects_final_state_keep_set(transit2, EINA_TRUE);
1589
1590    transit3 = elm_transit_add();
1591    elm_transit_object_add(transit3, vd->obj);
1592    elm_transit_effect_add(transit3, transit_progressbar_process_B_op3, vd, NULL);
1593    elm_transit_duration_set(transit3, 0.33);
1594    elm_transit_objects_final_state_keep_set(transit3, EINA_TRUE);
1595
1596    elm_transit_chain_transit_add(transit1, transit2);
1597    elm_transit_chain_transit_add(transit2, transit3);
1598
1599    elm_transit_go(transit1);
1600
1601    // For Layer C Animation
1602    transit1 = elm_transit_add();
1603    elm_transit_object_add(transit1, vd->obj);
1604    elm_transit_effect_add(transit1, transit_progressbar_process_C_op1, vd, _transit_progreassbar_process_end);
1605    elm_transit_duration_set(transit1, 0.85);
1606    elm_transit_objects_final_state_keep_set(transit1, EINA_TRUE);
1607    vd->transit = transit1;
1608    elm_transit_go_in(transit1, .54);
1609 }
1610
1611 static void
1612 _transit_progreassbar_process_end(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
1613 {
1614    vg_progressbar *vd = effect;
1615    if (!vd->transit) return;
1616    vd->transit = NULL;
1617    _progressbar_process_pulse_start_helper(vd);
1618 }
1619
1620 static void
1621 _progressbar_process_pulse_start(void *data,
1622                        Evas_Object *obj EINA_UNUSED,
1623                        const char *emission EINA_UNUSED,
1624                        const char *source EINA_UNUSED)
1625 {
1626    _progressbar_process_pulse_start_helper(data);
1627 }
1628
1629 static void
1630 _progressbar_process_pulse_stop(void *data,
1631                        Evas_Object *obj EINA_UNUSED,
1632                        const char *emission EINA_UNUSED,
1633                        const char *source EINA_UNUSED)
1634 {
1635    vg_progressbar *vd = data;
1636    Elm_Transit *cur_transit = vd->transit;
1637    vd->transit = NULL;
1638    if (cur_transit)
1639      elm_transit_del(cur_transit);
1640 }
1641
1642 static void
1643 _progressbar_process_style(vg_progressbar *vd)
1644 {
1645    Efl_VG *root;
1646    int i;
1647    Evas *e = evas_object_evas_get(vd->obj);
1648
1649    for(i=0; i < 3; i++)
1650      {
1651         vd->vg[i] = evas_object_vg_add(e);
1652         root = evas_object_vg_root_node_get(vd->vg[i]);
1653         vd->shape[i] = evas_vg_shape_add(root);
1654         evas_vg_shape_stroke_color_set(vd->shape[i], 255, 255, 255, 255);
1655         evas_vg_shape_stroke_cap_set(vd->shape[i], EFL_GFX_CAP_ROUND);
1656      }
1657
1658    evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1659                                   progressbar_process_resize_cb, vd);
1660
1661    elm_object_part_content_set(vd->obj, "tizen_vg_shape1", vd->vg[0]);
1662    elm_object_part_content_set(vd->obj, "tizen_vg_shape2", vd->vg[1]);
1663    elm_object_part_content_set(vd->obj, "tizen_vg_shape3", vd->vg[2]);
1664
1665    elm_object_signal_callback_add(vd->obj, "elm,state,pulse,start",
1666                                   "*", _progressbar_process_pulse_start, vd);
1667
1668    elm_object_signal_callback_add(vd->obj, "elm,state,pulse,stop",
1669                                    "*", _progressbar_process_pulse_stop, vd);
1670
1671 }
1672
1673 void
1674 tizen_vg_progressbar_set(Elm_Progressbar *obj)
1675 {
1676    vg_progressbar *vd = evas_object_data_get(obj, vg_key);
1677    if (vd)
1678      {
1679         if (vd->vg[0]) evas_object_del(vd->vg[0]);
1680         if (vd->vg[1]) evas_object_del(vd->vg[1]);
1681         if (vd->vg[2]) evas_object_del(vd->vg[2]);
1682         vd->x = 0;
1683      }
1684
1685    //Apply vector ux only theme has "vector_ux"
1686    const char *str = elm_layout_data_get(obj, "vector_ux");
1687    if (!str) return;
1688
1689    if (!vd)
1690      {
1691         vd = calloc(1, sizeof(vg_progressbar));
1692         evas_object_data_set(obj, vg_key, vd);
1693         vd->obj = obj;
1694         // callback to free vd data
1695         // Note: we need progressbar_del_cb() to be called first so that we can stop the
1696         // transition properly in case of process style.
1697         // As the elm_transition also adds the EVAS_CALLBACK_DEL callback on the same object (vd->obj)
1698         // for deleting the transition it causes problem when elm_transition's cb called before our
1699         // deletion callback (as we restart the transition loop again).
1700         // to fix the above issue we add our callback as a priority one to make sure it is called first.
1701         evas_object_event_callback_priority_add(vd->obj, EVAS_CALLBACK_DEL,
1702                                                 EVAS_CALLBACK_PRIORITY_BEFORE,
1703                                                 progressbar_del_cb, NULL);
1704      }
1705    if (!vd)
1706      {
1707         ERR("Failed to allocate vector graphics data memory");
1708         return;
1709      }
1710
1711
1712    if (!strcmp(str, "default"))
1713      {
1714         _progressbar_normal_style(vd);
1715         return;
1716      }
1717    if (!strcmp(str, "process_large") ||
1718        !strcmp(str, "process_medium") ||
1719        !strcmp(str, "process_small"))
1720      {
1721         vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 3);
1722         if (!strcmp(str, "process_medium"))
1723           {
1724              vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 2);
1725           }
1726         if (!strcmp(str, "process_small"))
1727           {
1728              vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 1.5);
1729           }
1730         vd->shrink = 2 * vd->stroke_width;
1731         vd->shift = vd->stroke_width + 0.5;
1732         _progressbar_process_style(vd);
1733         return;
1734      }
1735 }
1736
1737 /////////////////////////////////////////////////////////////////////////
1738 /* Slider */
1739 /////////////////////////////////////////////////////////////////////////
1740
1741 typedef struct vg_slider_s
1742 {
1743    Evas_Object *vg[7];
1744    Efl_VG_Shape *shape[7];
1745    Evas_Object *obj;
1746    Eina_Stringshare *style;
1747 } vg_slider;
1748
1749 static int slider_base = 0;
1750 static int slider_level = 1;
1751 static int slider_level2 = 2;
1752 static int slider_level_rest = 3;
1753 static int slider_center = 4;
1754 static int slider_handle = 5;
1755 static int slider_handle_pressed = 6;
1756
1757 static void
1758 slider_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
1759               void *event_info EINA_UNUSED)
1760 {
1761    vg_slider *vd = evas_object_data_get(obj, vg_key);
1762    if (vd)
1763      {
1764         evas_object_data_set(obj, vg_key, NULL);
1765         free(vd);
1766      }
1767 }
1768
1769 static void
1770 _append_circle(Efl_VG *shape, int cx, int cy, int r)
1771 {
1772    evas_vg_shape_shape_reset(shape);
1773    evas_vg_shape_shape_append_circle(shape, cx, cy, r);
1774 }
1775
1776 static void
1777 _append_round_rect(Efl_VG *shape, int w, int h)
1778 {
1779    double radius = w/2 > h/2 ? h/2 : w/2;
1780    evas_vg_shape_shape_reset(shape);
1781    evas_vg_shape_shape_append_rect(shape, 0, 0, w, h, radius, radius);
1782 }
1783
1784 static void
1785 slider_vg_handle_normal_resize_cb(void *data , Evas *e EINA_UNUSED,
1786                                   Evas_Object *obj EINA_UNUSED,
1787                                   void *event_info EINA_UNUSED)
1788 {
1789    Evas_Coord w, h;
1790    vg_slider *vd = data;
1791    evas_object_geometry_get(vd->vg[slider_handle], NULL, NULL, &w, &h);
1792    _append_circle(vd->shape[slider_handle], w/2, h/2, w/2);
1793 }
1794
1795 static void
1796 slider_vg_handle_pressed_resize_cb(void *data , Evas *e EINA_UNUSED,
1797                             Evas_Object *obj EINA_UNUSED,
1798                             void *event_info EINA_UNUSED)
1799 {
1800    Evas_Coord w, h;
1801    vg_slider *vd = data;
1802    evas_object_geometry_get(vd->vg[slider_handle_pressed], NULL, NULL, &w, &h);
1803    if (w == h)
1804      _append_circle(vd->shape[slider_handle_pressed], w/2, h/2, w/2);
1805    else
1806      {
1807         if (elm_slider_indicator_show_get(vd->obj) &&
1808             elm_slider_indicator_format_get(vd->obj))
1809           _append_round_rect(vd->shape[slider_handle_pressed], w, h);
1810         else
1811           _append_circle(vd->shape[slider_handle_pressed], w/2, h - w/2, w/2);
1812      }
1813 }
1814
1815 static void
1816 slider_base_resize_cb(void *data , Evas *e EINA_UNUSED,
1817                             Evas_Object *obj EINA_UNUSED,
1818                             void *event_info EINA_UNUSED)
1819 {
1820    Evas_Coord w, h;
1821    vg_slider *vd = data;
1822    evas_object_geometry_get(vd->vg[slider_base], NULL, NULL, &w, &h);
1823    _append_round_rect(vd->shape[slider_base], w, h);
1824 }
1825
1826 static void
1827 slider_center_resize_cb(void *data , Evas *e EINA_UNUSED,
1828                             Evas_Object *obj EINA_UNUSED,
1829                             void *event_info EINA_UNUSED)
1830 {
1831    Evas_Coord w, h;
1832    vg_slider *vd = data;
1833    evas_object_geometry_get(vd->vg[slider_center], NULL, NULL, &w, &h);
1834    _append_round_rect(vd->shape[slider_center], w, h);
1835 }
1836
1837 static void
1838 slider_level_resize_cb(void *data , Evas *e EINA_UNUSED,
1839                             Evas_Object *obj EINA_UNUSED,
1840                             void *event_info EINA_UNUSED)
1841 {
1842    Evas_Coord w, h;
1843    vg_slider *vd = data;
1844    evas_object_geometry_get(vd->vg[slider_level], NULL, NULL, &w, &h);
1845    _append_round_rect(vd->shape[slider_level], w, h);
1846 }
1847
1848 static void
1849 slider_level2_resize_cb(void *data , Evas *e EINA_UNUSED,
1850                             Evas_Object *obj EINA_UNUSED,
1851                             void *event_info EINA_UNUSED)
1852 {
1853    Evas_Coord w, h;
1854    vg_slider *vd = data;
1855    evas_object_geometry_get(vd->vg[slider_level2], NULL, NULL, &w, &h);
1856    _append_round_rect(vd->shape[slider_level2], w, h);
1857 }
1858
1859 static void
1860 slider_level_rest_resize_cb(void *data , Evas *e EINA_UNUSED,
1861                             Evas_Object *obj EINA_UNUSED,
1862                             void *event_info EINA_UNUSED)
1863 {
1864    Evas_Coord w, h;
1865    vg_slider *vd = data;
1866    evas_object_geometry_get(vd->vg[slider_level_rest], NULL, NULL, &w, &h);
1867    _append_round_rect(vd->shape[slider_level_rest], w, h);
1868 }
1869
1870 static void
1871 _slider_create_handle(vg_slider *vd)
1872 {
1873    Efl_VG *root;
1874    int i;
1875    Evas *e = evas_object_evas_get(vd->obj);
1876    for(i=0; i < 7; i++)
1877      {
1878         vd->vg[i] = evas_object_vg_add(e);
1879         root = evas_object_vg_root_node_get(vd->vg[i]);
1880         vd->shape[i] = evas_vg_shape_add(root);
1881         evas_vg_node_color_set(vd->shape[i], 255, 255, 255, 255);
1882
1883      }
1884    // slider base
1885    evas_object_event_callback_add(vd->vg[slider_base], EVAS_CALLBACK_RESIZE,
1886                                   slider_base_resize_cb, vd);
1887    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape1", vd->vg[slider_base]);
1888
1889    // level
1890    evas_object_event_callback_add(vd->vg[slider_level], EVAS_CALLBACK_RESIZE,
1891                                   slider_level_resize_cb, vd);
1892    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape2", vd->vg[slider_level]);
1893
1894    // level2
1895    evas_object_event_callback_add(vd->vg[slider_level2], EVAS_CALLBACK_RESIZE,
1896                                   slider_level2_resize_cb, vd);
1897    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape3", vd->vg[slider_level2]);
1898
1899    // level rest only for warning type
1900    evas_object_event_callback_add(vd->vg[slider_level_rest], EVAS_CALLBACK_RESIZE,
1901                                   slider_level_rest_resize_cb, vd);
1902    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape4", vd->vg[slider_level_rest]);
1903
1904    // center point
1905    evas_object_event_callback_add(vd->vg[slider_center], EVAS_CALLBACK_RESIZE,
1906                                   slider_center_resize_cb, vd);
1907    elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape5", vd->vg[slider_center]);
1908
1909    // slider handle
1910    evas_object_event_callback_add(vd->vg[slider_handle], EVAS_CALLBACK_RESIZE,
1911                                   slider_vg_handle_normal_resize_cb, vd);
1912    evas_object_event_callback_add(vd->vg[slider_handle_pressed], EVAS_CALLBACK_RESIZE,
1913                                   slider_vg_handle_pressed_resize_cb, vd);
1914    elm_object_part_content_set(vd->obj, "elm.dragable.slider:elm.swallow.tizen_vg_shape1", vd->vg[slider_handle]);
1915    elm_object_part_content_set(vd->obj, "elm.dragable.slider:elm.swallow.tizen_vg_shape2", vd->vg[slider_handle_pressed]);
1916 }
1917
1918 void
1919 tizen_vg_slider_set(Elm_Slider *obj)
1920 {
1921    vg_slider *vd = evas_object_data_get(obj, vg_key);
1922    if (vd)
1923      {
1924         int i;
1925         for(i=0; i < 7; i++)
1926           if (vd->vg[i]) evas_object_del(vd->vg[i]);
1927         eina_stringshare_del(vd->style);
1928      }
1929
1930    //Apply vector ux only theme has "vector_ux" "on"
1931    const char *str = elm_layout_data_get(obj, "vector_ux");
1932    if (!str) return;
1933
1934    if (!vd)
1935      {
1936         vd = calloc(1, sizeof(vg_slider));
1937         evas_object_data_set(obj, vg_key, vd);
1938         vd->obj = obj;
1939         // callback to free vd data
1940         evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_DEL,
1941                                        slider_del_cb, NULL);
1942      }
1943    if (!vd)
1944      {
1945         ERR("Failed to allocate vector graphics data memory");
1946         return;
1947      }
1948
1949    vd->style = eina_stringshare_add(str);
1950
1951    _slider_create_handle(vd);
1952 }
1953 #endif