2 # include "elementary_config.h"
5 #include <Elementary.h>
8 #define EFL_BETA_API_SUPPORT 1
10 #ifdef TIZEN_VECTOR_UX
12 static const char *vg_key = "_tizen_vg";
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.
25 ELM_VG_SCALE_SIZE(Evas_Object* obj, double x)
27 if (elm_app_base_scale_get() > 1)
28 return (ELM_SCALE_SIZE(x) * elm_object_scale_get(obj));
30 return (((x) / 1.7) * elm_config_scale_get() * elm_object_scale_get(obj));
32 /////////////////////////////////////////////////////////////////////////
34 /////////////////////////////////////////////////////////////////////////
35 typedef struct vg_radio_s
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
45 adjust_radius(int radius)
47 //FIXME: remove once ector backend
48 // draws perfect circle for odd radius value.
49 if (radius & 1) radius -= 1;
54 transit_radio_op(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED,
57 vg_radio *vd = effect;
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);
64 if (elm_radio_selected_object_get(vd->obj) != vd->obj)
65 progress = 1 - progress;
67 int radius = (center_x < center_y ? center_x : center_y)
68 - (2 * ELM_VG_SCALE_SIZE(vd->obj, 1.5));
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)));
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);
82 transit_radio_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
89 radio_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
90 void *event_info EINA_UNUSED)
95 elm_transit_del(vd->transit);
96 vd->transit = elm_transit_add();
97 elm_transit_effect_add(vd->transit, transit_radio_op, vd,
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);
107 radio_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
108 void *event_info EINA_UNUSED)
111 evas_object_data_set(vd->obj, vg_key, NULL);
112 evas_object_smart_callback_del(vd->obj, "changed",
114 elm_transit_del(vd->transit);
115 evas_object_del(vd->vg[1]);
116 evas_object_del(vd->vg[2]);
121 radio_init(vg_radio *vd)
123 if (vd->init) return;
124 vd->init = EINA_TRUE;
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));
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);
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));
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);
146 radio_base_resize_cb(void *data, Evas *e EINA_UNUSED,
147 Evas_Object *obj EINA_UNUSED,
148 void *event_info EINA_UNUSED)
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);
159 int radius = (center_x < center_y ? center_x : center_y)
160 -(2 * ELM_VG_SCALE_SIZE(vd->obj, 1.5));
162 radius = adjust_radius(radius);
165 evas_vg_shape_shape_reset(vd->shape[0]);
166 evas_vg_shape_shape_append_circle(vd->shape[0], center_x, center_y,
169 if (elm_radio_selected_object_get(vd->obj) != vd->obj) return;
172 evas_vg_shape_shape_reset(vd->shape[1]);
173 evas_vg_shape_shape_append_circle(vd->shape[1], center_x, center_y,
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,
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,
190 tizen_vg_radio_set(Elm_Radio *obj)
192 vg_radio *vd = evas_object_data_get(obj, vg_key);
193 if (vd) evas_object_del(vd->vg[0]);
195 //Apply vector ux only theme has "vector_ux"
196 const char *str = elm_layout_data_get(obj, "vector_ux");
199 vd = calloc(1, sizeof(vg_radio));
202 ERR("Failed to allocate vector graphics data memory");
205 evas_object_data_set(obj, vg_key, vd);
206 evas_object_smart_callback_add(obj, "changed", radio_changed_cb, vd);
208 //Vector Graphics Object
209 Evas *e = evas_object_evas_get(obj);
214 vd->vg[0] = evas_object_vg_add(e);
215 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
217 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
218 radio_base_resize_cb, vd);
220 vd->vg[1] = evas_object_vg_add(e);
223 vd->vg[2] = evas_object_vg_add(e);
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]);
231 /////////////////////////////////////////////////////////////////////////
232 /* Check: Favorite */
233 /////////////////////////////////////////////////////////////////////////
234 typedef struct check_favorite_s
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;
244 check_favorite_init(check_favorite *vd)
246 if (vd->init) return;
247 vd->init = EINA_TRUE;
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);
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);
261 check_favorite_shape_do(check_favorite *vd, int idx)
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);
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);
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]));
282 for (i = 1; i < PT_CNT; i++)
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]));
288 evas_vg_shape_shape_append_close(vd->shape[idx]);
293 check_favorite_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
294 Evas_Object *obj EINA_UNUSED,
295 void *event_info EINA_UNUSED)
297 check_favorite *vd = data;
298 check_favorite_shape_do(vd, 0);
302 check_favorite_vg2_resize_cb(void *data, Evas *e EINA_UNUSED,
303 Evas_Object *obj EINA_UNUSED,
304 void *event_info EINA_UNUSED)
306 check_favorite *vd = data;
307 if (!elm_check_state_get(vd->obj)) return;
308 check_favorite_shape_do(vd, 1);
312 transit_check_favorite_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
314 check_favorite *vd = data;
319 _check_favorite(check_favorite *vd, double progress)
321 check_favorite_shape_do(vd, 1);
323 if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
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);
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);
339 transit_check_favorite_op(Elm_Transit_Effect *effect,
340 Elm_Transit *transit EINA_UNUSED, double progress)
342 check_favorite *vd = effect;
343 _check_favorite(vd, progress);
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)
351 check_favorite *vd = data;
353 if (strcmp(source, "tizen_vg")) return;
355 check_favorite_init(vd);
357 Eina_Bool check = elm_check_state_get(obj);
360 elm_transit_del(vd->transit);
361 vd->transit = elm_transit_add();
362 elm_transit_effect_add(vd->transit, transit_check_favorite_op, vd,
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);
369 elm_transit_duration_set(vd->transit, 0.3);
370 elm_transit_go_in(vd->transit, 0.1);
374 elm_transit_duration_set(vd->transit, 0.3);
375 elm_transit_go(vd->transit);
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)
384 check_favorite *vd = data;
386 if (strcmp(source, "tizen_vg")) return;
388 check_favorite_init(vd);
390 _check_favorite(vd, 1.0);
394 check_favorite_del_cb(void *data, Evas *e EINA_UNUSED,
395 Evas_Object *obj EINA_UNUSED,
396 void *event_info EINA_UNUSED)
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]);
408 tizen_vg_check_favorite_set(Elm_Check *obj)
410 check_favorite *vd = calloc(1, sizeof(check_favorite));
413 ERR("Failed to allocate vector graphics data memory");
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);
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);
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);
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]);
437 /////////////////////////////////////////////////////////////////////////
439 /////////////////////////////////////////////////////////////////////////
440 typedef struct check_onoff_s
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
451 check_onoff_init(check_onoff *vd)
453 if (vd->init) return;
454 vd->init = EINA_TRUE;
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);
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);
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);
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));
477 _check_onoff_circle(check_onoff *vd, double progress)
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);
484 evas_vg_shape_shape_reset(vd->shape[3]);
486 double radius = (center_x < center_y ? center_x : center_y) -
487 (ELM_VG_SCALE_SIZE(vd->obj, 3));
489 if (elm_check_state_get(vd->obj)) progress = 1 - progress;
491 evas_vg_shape_shape_append_circle(vd->shape[3], center_x, center_y,
496 transit_check_onoff_circle_op(Elm_Transit_Effect *effect,
497 Elm_Transit *transit EINA_UNUSED, double progress)
499 check_onoff *vd = effect;
500 _check_onoff_circle(vd, progress);
504 transit_check_onoff_circle_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
506 check_onoff *vd = data;
507 vd->transit[0] = NULL;
511 _check_onoff_line(check_onoff *vd, double progress)
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);
518 evas_vg_shape_shape_reset(vd->shape[2]);
520 if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
522 double diff = center_y - ELM_VG_SCALE_SIZE(vd->obj, 3) - 1;
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)));
531 transit_check_onoff_line_op(void *data, Elm_Transit *transit EINA_UNUSED,
534 check_onoff *vd = data;
535 _check_onoff_line(vd, progress);
539 transit_check_onoff_line_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
541 check_onoff *vd = data;
542 vd->transit[1] = NULL;
546 _check_onoff_sizing(check_onoff *vd, double progress)
548 check_onoff_init(vd);
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);
555 if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
558 evas_vg_shape_shape_reset(vd->shape[1]);
559 evas_vg_shape_shape_append_circle(vd->shape[1],
561 (0.7 + progress) * center_x);
565 transit_check_onoff_sizing_op(void *data, Elm_Transit *transit EINA_UNUSED,
568 check_onoff *vd = data;
569 _check_onoff_sizing(vd, progress);
573 transit_check_onoff_sizing_del_cb(void *data,
574 Elm_Transit *transit EINA_UNUSED)
576 check_onoff *vd = data;
577 vd->transit[2] = NULL;
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)
585 check_onoff *vd = data;
587 if (strcmp(source, "tizen_vg")) return;
589 check_onoff_init(vd);
591 Eina_Bool check = elm_check_state_get(obj);
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,
598 elm_transit_del_cb_set(vd->transit[0], transit_check_onoff_circle_del_cb,
600 elm_transit_tween_mode_set(vd->transit[0],
601 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
604 elm_transit_duration_set(vd->transit[0], 0.1);
605 elm_transit_go(vd->transit[0]);
609 elm_transit_duration_set(vd->transit[0], 0.25);
610 elm_transit_go_in(vd->transit[0], 0.05);
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,
618 elm_transit_del_cb_set(vd->transit[1], transit_check_onoff_line_del_cb,
620 elm_transit_tween_mode_set(vd->transit[1],
621 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
624 elm_transit_duration_set(vd->transit[1], 0.25);
625 elm_transit_go_in(vd->transit[1], 0.05);
629 elm_transit_duration_set(vd->transit[1], 0.1);
630 elm_transit_go(vd->transit[1]);
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,
638 elm_transit_del_cb_set(vd->transit[2], transit_check_onoff_sizing_del_cb,
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]);
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)
651 check_onoff *vd = data;
653 if (strcmp(source, "tizen_vg")) return;
655 check_onoff_init(vd);
657 _check_onoff_circle(vd, 1.0);
658 _check_onoff_line(vd, 1.0);
659 _check_onoff_sizing(vd, 1.0);
663 check_onoff_del_cb(void *data, Evas *e EINA_UNUSED,
664 Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
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]);
678 check_onoff_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
679 Evas_Object *obj EINA_UNUSED,
680 void *event_info EINA_UNUSED)
682 check_onoff *vd = data;
684 check_onoff_init(vd);
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);
691 evas_vg_shape_shape_reset(vd->shape[0]);
692 evas_vg_shape_shape_append_circle(vd->shape[0], center_x, center_y,
697 check_onoff_vg2_resize_cb(void *data, Evas *e EINA_UNUSED,
698 Evas_Object *obj EINA_UNUSED,
699 void *event_info EINA_UNUSED)
701 check_onoff *vd = data;
703 check_onoff_init(vd);
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);
710 evas_vg_shape_shape_reset(vd->shape[1]);
711 evas_vg_shape_shape_append_circle(vd->shape[1],
717 check_onoff_vg3_resize_cb(void *data, Evas *e EINA_UNUSED,
718 Evas_Object *obj EINA_UNUSED,
719 void *event_info EINA_UNUSED)
721 check_onoff *vd = data;
723 check_onoff_init(vd);
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);
730 evas_vg_shape_shape_reset(vd->shape[2]);
731 evas_vg_shape_shape_reset(vd->shape[3]);
734 if (elm_check_state_get(vd->obj))
736 double diff = ELM_VG_SCALE_SIZE(vd->obj, 3) - 1;
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);
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);
752 tizen_vg_check_onoff_set(Elm_Check *obj)
754 check_onoff *vd = calloc(1, sizeof(check_onoff));
757 ERR("Failed to allocate vector graphics data memory");
760 evas_object_data_set(obj, vg_key, vd);
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);
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);
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);
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]);
789 /////////////////////////////////////////////////////////////////////////
791 /////////////////////////////////////////////////////////////////////////
792 typedef struct check_default_s
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
798 double left_move_to[2];
799 double left_line_to[2];
800 double right_move_to[2];
801 double right_line_to[2];
806 check_default_init(check_default *vd)
808 if (vd->init) return;
809 vd->init = EINA_TRUE;
811 Efl_VG *base_root = evas_object_vg_root_node_get(vd->vg[0]);
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));
819 vd->shape[1] = evas_vg_shape_add(base_root);
821 Efl_VG *line_root = evas_object_vg_root_node_get(vd->vg[1]);
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);
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);
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);
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);
847 check_default_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
848 Evas_Object *obj EINA_UNUSED,
849 void *event_info EINA_UNUSED)
851 check_default *vd = data;
853 check_default_init(vd);
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);
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,
864 ELM_VG_SCALE_SIZE(vd->obj, 5),
865 ELM_VG_SCALE_SIZE(vd->obj, 5));
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);
875 evas_vg_node_color_set(vd->shape[1], 0, 0, 0, 0);
878 if (elm_check_state_get(vd->obj))
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]));
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]));
904 transit_check_default_bg_color_del_cb(Elm_Transit_Effect *effect,
905 Elm_Transit *transit EINA_UNUSED)
907 check_default *vd = effect;
908 vd->transit[0] = NULL;
913 _check_default_bg_color(check_default *vd, double progress)
917 if (elm_check_state_get(vd->obj)) color = 255 * progress;
918 else color = 255 * (1 - progress);
920 evas_vg_node_color_set(vd->shape[1], color, color, color, color);
924 transit_check_default_bg_color_op(Elm_Transit_Effect *effect,
925 Elm_Transit *transit EINA_UNUSED,
928 check_default *vd = effect;
929 _check_default_bg_color(vd, progress);
933 transit_check_default_bg_scale_del_cb(Elm_Transit_Effect *effect,
934 Elm_Transit *transit EINA_UNUSED)
936 check_default *vd = effect;
937 vd->transit[1] = NULL;
941 _check_default_bg_scale(check_default *vd, double progress)
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);
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);
956 transit_check_default_bg_scale_op(Elm_Transit_Effect *effect,
957 Elm_Transit *transit EINA_UNUSED,
960 check_default *vd = effect;
961 _check_default_bg_scale(vd, progress);
965 transit_check_default_line_del_cb(Elm_Transit_Effect *effect,
966 Elm_Transit *transit EINA_UNUSED)
968 check_default *vd = effect;
969 vd->transit[2] = NULL;
973 _check_default_line(check_default *vd, double progress)
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);
981 if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
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));
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));
1007 transit_check_default_line_op(Elm_Transit_Effect *effect,
1008 Elm_Transit *transit EINA_UNUSED, double progress)
1010 check_default *vd = effect;
1011 _check_default_line(vd, progress);
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)
1019 check_default *vd = data;
1020 if (!source) return;
1021 if (strcmp(source, "tizen_vg")) return;
1023 check_default_init(vd);
1025 Eina_Bool check = elm_check_state_get(obj);
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,
1032 elm_transit_del_cb_set(vd->transit[0], transit_check_default_bg_color_del_cb,
1034 elm_transit_tween_mode_set(vd->transit[0],
1035 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
1039 elm_transit_duration_set(vd->transit[0], 0.3);
1040 elm_transit_go(vd->transit[0]);
1044 elm_transit_duration_set(vd->transit[0], 0.3);
1045 elm_transit_go_in(vd->transit[0], 0.15);
1049 elm_transit_del(vd->transit[1]);
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]);
1065 elm_transit_del(vd->transit[2]);
1067 vd->transit[2] = elm_transit_add();
1068 elm_transit_effect_add(vd->transit[2], transit_check_default_line_op, vd,
1070 elm_transit_del_cb_set(vd->transit[2], transit_check_default_line_del_cb,
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);
1077 elm_transit_go_in(vd->transit[2], 0.15);
1079 elm_transit_go(vd->transit[2]);
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)
1087 check_default *vd = data;
1088 if (!source) return;
1089 if (strcmp(source, "tizen_vg")) return;
1091 check_default_init(vd);
1093 _check_default_bg_color(vd, 1.0);
1094 _check_default_bg_scale(vd, 1.0);
1095 _check_default_line(vd, 1.0);
1099 check_default_del_cb(void *data, Evas *e EINA_UNUSED,
1100 Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
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]);
1114 tizen_vg_check_default_set(Elm_Check *obj)
1116 check_default *vd = calloc(1, sizeof(check_default));
1119 ERR("Failed to allocate vector graphics data memory");
1122 evas_object_data_set(obj, vg_key, vd);
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);
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);
1136 vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
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]);
1143 tizen_vg_check_set(Elm_Check *obj)
1145 check_default *vd = evas_object_data_get(obj, vg_key);
1146 if (vd) evas_object_del(vd->vg[0]);
1148 //Apply vector ux only theme has "vector_ux"
1149 const char *str = elm_layout_data_get(obj, "vector_ux");
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);
1161 tizen_vg_check_state_set(Elm_Check *obj)
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));
1171 /////////////////////////////////////////////////////////////////////////
1173 /////////////////////////////////////////////////////////////////////////
1174 typedef struct vg_button_s
1176 Evas_Object *vg[2]; //0: base, 1: effect
1177 Efl_VG_Shape *shape[2]; //0: base, 1: effect
1183 button_init(vg_button *vd)
1185 if (vd->init) return;
1186 vd->init = EINA_TRUE;
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);
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);
1200 button_effect_resize_cb(void *data, Evas *e EINA_UNUSED,
1201 Evas_Object *obj EINA_UNUSED,
1202 void *event_info EINA_UNUSED)
1204 vg_button *vd = data;
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]);
1213 evas_vg_shape_shape_append_circle(vd->shape[1], w/2, h/2, w/2);
1215 evas_vg_shape_shape_append_rect(vd->shape[1], 0, 0, w, h, h/2, h/2);
1219 button_base_resize_cb(void *data, Evas *e EINA_UNUSED,
1220 Evas_Object *obj EINA_UNUSED,
1221 void *event_info EINA_UNUSED)
1223 vg_button *vd = data;
1229 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
1230 evas_vg_shape_shape_reset(vd->shape[0]);
1232 evas_vg_shape_shape_append_circle(vd->shape[0], w/2, h/2, w/2);
1234 evas_vg_shape_shape_append_rect(vd->shape[0], 0, 0, w, h, h/2, h/2);
1238 button_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
1239 void *event_info EINA_UNUSED)
1241 vg_button *vd = data;
1242 evas_object_data_del(vd->obj, vg_key);
1243 evas_object_del(vd->vg[1]);
1248 tizen_vg_button_set(Elm_Button *obj)
1250 vg_button *vd = evas_object_data_get(obj, vg_key);
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]);
1258 //Apply vector ux only theme has "vector_ux"
1259 const char *str = elm_layout_data_get(obj, "vector_ux");
1262 vd = calloc(1, sizeof(vg_button));
1265 ERR("Failed to allocate vector graphics data memory");
1268 evas_object_data_set(obj, vg_key, vd);
1270 //Vector Graphics Object
1271 Evas *e = evas_object_evas_get(obj);
1276 vd->vg[0] = evas_object_vg_add(e);
1277 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1279 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1280 button_base_resize_cb, vd);
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);
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]);
1290 /////////////////////////////////////////////////////////////////////////
1292 /////////////////////////////////////////////////////////////////////////
1294 typedef struct vg_progressbar_s
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;
1300 Evas_Coord x, w, h; // for normal style animation data
1301 double stroke_width;
1307 progressbar_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
1308 void *event_info EINA_UNUSED)
1310 vg_progressbar *vd = evas_object_data_get(obj, vg_key);
1311 Elm_Transit *cur_transit = vd->transit;
1314 elm_transit_del(cur_transit);
1317 evas_object_data_set(obj, vg_key, NULL);
1323 transit_progressbar_normal_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1325 vg_progressbar *vd = effect;
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);
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);
1340 transit_progressbar_normal_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
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);
1350 transit_progressbar_normal_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1352 vg_progressbar *vd = effect;
1353 int c = 255 - 255*progress;
1354 evas_vg_node_color_set(vd->shape[2], c, c, c, c);
1358 progressbar_normal_bg_resize_cb(void *data , Evas *e EINA_UNUSED,
1359 Evas_Object *obj EINA_UNUSED,
1360 void *event_info EINA_UNUSED)
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);
1371 progressbar_normal_fg_resize_cb(void *data, Evas *e EINA_UNUSED,
1372 Evas_Object *obj EINA_UNUSED,
1373 void *event_info EINA_UNUSED)
1375 Evas_Coord x, y, w, h;
1376 vg_progressbar *vd = data;
1377 evas_object_geometry_get(vd->vg[1], &x, &y, &w, &h);
1380 if (vd->w >= w) vd->x = 0;
1381 else vd->x = vd->w - vd->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);
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);
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);
1403 elm_transit_chain_transit_add(transit1, transit2);
1404 elm_transit_chain_transit_add(transit2, transit3);
1406 elm_transit_go(transit1);
1411 _progressbar_normal_style(vg_progressbar *vd)
1415 Evas *e = evas_object_evas_get(vd->obj);
1417 for(i=0; i < 3; i++)
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);
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);
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");
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]);
1440 progressbar_process_resize_cb(void *data , Evas *e EINA_UNUSED,
1441 Evas_Object *obj EINA_UNUSED,
1442 void *event_info EINA_UNUSED)
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++)
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);
1458 transit_progressbar_process_A_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
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);
1471 transit_progressbar_process_A_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
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);
1484 transit_progressbar_process_A_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
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);
1497 transit_progressbar_process_B_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
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);
1510 transit_progressbar_process_B_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
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);
1523 transit_progressbar_process_B_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
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);
1536 transit_progressbar_process_C_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
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);
1548 static void _transit_progreassbar_process_end(Elm_Transit_Effect *effect, Elm_Transit *transit);
1551 _progressbar_process_pulse_start_helper(vg_progressbar *vd)
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);
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);
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);
1572 elm_transit_chain_transit_add(transit1, transit2);
1573 elm_transit_chain_transit_add(transit2, transit3);
1575 elm_transit_go(transit1);
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);
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);
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);
1596 elm_transit_chain_transit_add(transit1, transit2);
1597 elm_transit_chain_transit_add(transit2, transit3);
1599 elm_transit_go(transit1);
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);
1612 _transit_progreassbar_process_end(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
1614 vg_progressbar *vd = effect;
1615 if (!vd->transit) return;
1617 _progressbar_process_pulse_start_helper(vd);
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)
1626 _progressbar_process_pulse_start_helper(data);
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)
1635 vg_progressbar *vd = data;
1636 Elm_Transit *cur_transit = vd->transit;
1639 elm_transit_del(cur_transit);
1643 _progressbar_process_style(vg_progressbar *vd)
1647 Evas *e = evas_object_evas_get(vd->obj);
1649 for(i=0; i < 3; i++)
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);
1658 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1659 progressbar_process_resize_cb, vd);
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]);
1665 elm_object_signal_callback_add(vd->obj, "elm,state,pulse,start",
1666 "*", _progressbar_process_pulse_start, vd);
1668 elm_object_signal_callback_add(vd->obj, "elm,state,pulse,stop",
1669 "*", _progressbar_process_pulse_stop, vd);
1674 tizen_vg_progressbar_set(Elm_Progressbar *obj)
1676 vg_progressbar *vd = evas_object_data_get(obj, vg_key);
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]);
1685 //Apply vector ux only theme has "vector_ux"
1686 const char *str = elm_layout_data_get(obj, "vector_ux");
1691 vd = calloc(1, sizeof(vg_progressbar));
1692 evas_object_data_set(obj, vg_key, vd);
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);
1707 ERR("Failed to allocate vector graphics data memory");
1712 if (!strcmp(str, "default"))
1714 _progressbar_normal_style(vd);
1717 if (!strcmp(str, "process_large") ||
1718 !strcmp(str, "process_medium") ||
1719 !strcmp(str, "process_small"))
1721 vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 3);
1722 if (!strcmp(str, "process_medium"))
1724 vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 2);
1726 if (!strcmp(str, "process_small"))
1728 vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 1.5);
1730 vd->shrink = 2 * vd->stroke_width;
1731 vd->shift = vd->stroke_width + 0.5;
1732 _progressbar_process_style(vd);
1737 /////////////////////////////////////////////////////////////////////////
1739 /////////////////////////////////////////////////////////////////////////
1741 typedef struct vg_slider_s
1744 Efl_VG_Shape *shape[7];
1746 Eina_Stringshare *style;
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;
1758 slider_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
1759 void *event_info EINA_UNUSED)
1761 vg_slider *vd = evas_object_data_get(obj, vg_key);
1764 evas_object_data_set(obj, vg_key, NULL);
1770 _append_circle(Efl_VG *shape, int cx, int cy, int r)
1772 evas_vg_shape_shape_reset(shape);
1773 evas_vg_shape_shape_append_circle(shape, cx, cy, r);
1777 _append_round_rect(Efl_VG *shape, int w, int h)
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);
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)
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);
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)
1801 vg_slider *vd = data;
1802 evas_object_geometry_get(vd->vg[slider_handle_pressed], NULL, NULL, &w, &h);
1804 _append_circle(vd->shape[slider_handle_pressed], w/2, h/2, w/2);
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);
1811 _append_circle(vd->shape[slider_handle_pressed], w/2, h - w/2, w/2);
1816 slider_base_resize_cb(void *data , Evas *e EINA_UNUSED,
1817 Evas_Object *obj EINA_UNUSED,
1818 void *event_info EINA_UNUSED)
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);
1827 slider_center_resize_cb(void *data , Evas *e EINA_UNUSED,
1828 Evas_Object *obj EINA_UNUSED,
1829 void *event_info EINA_UNUSED)
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);
1838 slider_level_resize_cb(void *data , Evas *e EINA_UNUSED,
1839 Evas_Object *obj EINA_UNUSED,
1840 void *event_info EINA_UNUSED)
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);
1849 slider_level2_resize_cb(void *data , Evas *e EINA_UNUSED,
1850 Evas_Object *obj EINA_UNUSED,
1851 void *event_info EINA_UNUSED)
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);
1860 slider_level_rest_resize_cb(void *data , Evas *e EINA_UNUSED,
1861 Evas_Object *obj EINA_UNUSED,
1862 void *event_info EINA_UNUSED)
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);
1871 _slider_create_handle(vg_slider *vd)
1875 Evas *e = evas_object_evas_get(vd->obj);
1876 for(i=0; i < 7; i++)
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);
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]);
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]);
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]);
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]);
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]);
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]);
1919 tizen_vg_slider_set(Elm_Slider *obj)
1921 vg_slider *vd = evas_object_data_get(obj, vg_key);
1925 for(i=0; i < 7; i++)
1926 if (vd->vg[i]) evas_object_del(vd->vg[i]);
1927 eina_stringshare_del(vd->style);
1930 //Apply vector ux only theme has "vector_ux" "on"
1931 const char *str = elm_layout_data_get(obj, "vector_ux");
1936 vd = calloc(1, sizeof(vg_slider));
1937 evas_object_data_set(obj, vg_key, vd);
1939 // callback to free vd data
1940 evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_DEL,
1941 slider_del_cb, NULL);
1945 ERR("Failed to allocate vector graphics data memory");
1949 vd->style = eina_stringshare_add(str);
1951 _slider_create_handle(vd);