2 # include "elementary_config.h"
5 #include <Elementary.h>
7 #include "elm_widget_radio.h"
9 #define EFL_BETA_API_SUPPORT 1
11 #ifdef TIZEN_VECTOR_UX
13 static const char *vg_key = "_tizen_vg";
16 ELM_VG_SCALE_SIZE(Evas_Object* obj, double x)
18 Evas_Object *edje = elm_layout_edje_get(obj);
20 return ((x) * elm_config_scale_get() / edje_object_base_scale_get(edje) * elm_widget_scale_get(obj));
22 /////////////////////////////////////////////////////////////////////////
24 /////////////////////////////////////////////////////////////////////////
25 typedef struct vg_radio_s
27 Evas_Object *vg[3]; //0: bg, 1: outline, 2: icon
28 Efl_VG_Shape *shape[3]; //0: bg, 1: outline, 2: icon
35 radio_init(vg_radio *vd)
41 vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
42 evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
45 vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
46 evas_vg_shape_stroke_color_set(vd->shape[1], 255, 255, 255, 255);
48 //Iconic Circle (Center Point)
49 vd->shape[2] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
50 evas_vg_node_color_set(vd->shape[2], 255, 255, 255, 255);
55 _radio_bg_update(vg_radio *vd)
58 ELM_RADIO_DATA_GET(vd->obj, rd);
59 Eina_Bool on_case = rd->state;
60 Efl_VG * shape = vd->shape[0];
61 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
62 evas_vg_shape_reset(shape);
65 r -= 1; // 1 pixel margin
67 r -= 2; // 2 pixel margin
69 evas_vg_shape_append_circle(shape, w/2, h/2, r);
73 _radio_icon_update(vg_radio *vd, double progress)
76 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
77 double center_x = ((double)w / 2);
78 double center_y = ((double)h / 2);
80 double outline_stroke;
81 ELM_RADIO_DATA_GET(vd->obj, rd);
83 progress = 1 - progress;
85 offset = 2; // on case 2 pixel margin
87 outline_stroke = ELM_VG_SCALE_SIZE(vd->obj, 1) + progress * ELM_VG_SCALE_SIZE(vd->obj, 1.5);
88 double radius = (center_x < center_y ? center_x : center_y) - outline_stroke - offset;
90 //Iconic Circle (Outline)
91 evas_vg_shape_stroke_width_set(vd->shape[1], outline_stroke);
92 evas_vg_shape_reset(vd->shape[1]);
93 evas_vg_shape_append_circle(vd->shape[1], center_x, center_y, radius);
95 //Iconic Circle (Center)
96 radius = (radius - outline_stroke - ELM_VG_SCALE_SIZE(vd->obj, 4)) * progress;
97 evas_vg_shape_reset(vd->shape[2]);
98 evas_vg_shape_append_circle(vd->shape[2], center_x, center_y, radius);
102 transit_radio_op(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED,
105 vg_radio *vd = effect;
106 _radio_icon_update(vd, progress);
110 transit_radio_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
117 radio_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
118 const char *emission EINA_UNUSED,
123 if (strcmp(source, "tizen_vg")) return;
126 elm_transit_del(vd->transit);
127 vd->transit = elm_transit_add();
128 elm_transit_effect_add(vd->transit, transit_radio_op, vd,
130 elm_transit_del_cb_set(vd->transit, transit_radio_del_cb, vd);
131 elm_transit_tween_mode_set(vd->transit,
132 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
133 elm_transit_duration_set(vd->transit, 0.2);
134 elm_transit_go(vd->transit);
136 _radio_bg_update(vd);
140 radio_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
141 const char *emission EINA_UNUSED,
146 if (strcmp(source, "tizen_vg")) return;
149 _radio_icon_update(vd, 1.0);
150 _radio_bg_update(vd);
154 radio_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
155 void *event_info EINA_UNUSED)
158 evas_object_data_set(vd->obj, vg_key, NULL);
159 elm_object_signal_callback_del(vd->obj, "elm,radio,state,toggle", "tizen_vg", radio_state_toggle_cb);
160 elm_object_signal_callback_del(vd->obj, "elm,radio,action,toggle", "tizen_vg", radio_action_toggle_cb);
161 elm_transit_del(vd->transit);
162 evas_object_del(vd->vg[1]);
163 evas_object_del(vd->vg[2]);
168 radio_base_resize_cb(void *data, Evas *e EINA_UNUSED,
169 Evas_Object *obj EINA_UNUSED,
170 void *event_info EINA_UNUSED)
175 _radio_icon_update(vd, 1.0);
179 radio_vg_bg_resize_cb(void *data, Evas *e EINA_UNUSED,
180 Evas_Object *obj EINA_UNUSED,
181 void *event_info EINA_UNUSED)
185 _radio_bg_update(vd);
189 tizen_vg_radio_set(Elm_Radio *obj)
191 vg_radio *vd = evas_object_data_get(obj, vg_key);
192 if (vd) evas_object_del(vd->vg[0]);
194 //Apply vector ux only theme has "vector_ux"
195 const char *str = elm_layout_data_get(obj, "vector_ux");
198 vd = calloc(1, sizeof(vg_radio));
201 ERR("Failed to allocate vector graphics data memory");
204 evas_object_data_set(obj, vg_key, vd);
205 elm_object_signal_callback_add(obj, "elm,radio,state,toggle", "tizen_vg", radio_state_toggle_cb, vd);
206 elm_object_signal_callback_add(obj, "elm,radio,action,toggle", "tizen_vg", radio_action_toggle_cb, vd);
209 //Vector Graphics Object
210 Evas *e = evas_object_evas_get(obj);
215 vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
216 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
217 radio_vg_bg_resize_cb, vd);
220 vd->vg[1] = evas_object_vg_add(e);
221 evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_DEL,
223 evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
224 radio_base_resize_cb, vd);
227 vd->vg[2] = evas_object_vg_add(e);
229 elm_object_part_content_set(obj, "tizen_vg_shape_bg", vd->vg[0]);
230 elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[1]);
231 elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[2]);
235 tizen_vg_radio_state_set(Elm_Radio *obj)
237 // Fix for the state change visual change skips one frame.
238 // For vector enabled radio, visual change is handled in the
239 // code and it depends on "elm,radio,action,toggle" signal.
240 // as edje signal emit is asyn force one more message_signal to make sure
241 // state change related visual change occurs in the same frame.
242 edje_object_message_signal_process(elm_layout_edje_get(obj));
245 /////////////////////////////////////////////////////////////////////////
246 /* Check: Favorite */
247 /////////////////////////////////////////////////////////////////////////
248 typedef struct check_favorite_s
250 Evas_Object *vg[2]; //0: outline, 1: inner body
251 Efl_VG_Shape *shape[2]; //0: outline, 1: inner body
252 Elm_Transit *transit;
259 //favorite off svg path info
260 static const char *star_off = "M26.003,38.931c0.29,0,0.58,0.084,0.832,0.252\
261 l12.212,8.142c0.367,0.245,0.859,0.229,1.199-0.021c0.359-0.262,0.516-0.721,0.394-1.146l-4.104-14.367\
262 c-0.158-0.557,0.017-1.156,0.452-1.538l10.174-8.949c0.313-0.284,0.424-0.74,0.267-1.148c-0.159-0.415-0.546-0.681-0.987-0.681\
263 H33.433c-0.623,0-1.181-0.385-1.402-0.967L26.966,5.17c-0.153-0.398-0.549-0.67-0.98-0.67C25.55,4.501,25.154,4.773,25,5.177\
264 l-5.034,13.328c-0.221,0.583-0.779,0.97-1.404,0.97H5.557c-0.44,0-0.827,0.266-0.985,0.677c-0.158,0.413-0.049,0.869,0.279,1.164\
265 l10.158,8.937c0.434,0.383,0.609,0.981,0.451,1.538l-4.104,14.367c-0.123,0.425,0.033,0.883,0.387,1.14\
266 c0.357,0.258,0.85,0.271,1.211,0.028l12.217-8.144C25.423,39.015,25.713,38.931,26.003,38.931z";
268 //favorite on svg path info
269 static const char *star_on = "M39.633,49c-0.492,0-0.987-0.145-1.417-0.432l-12.212-8.141l-12.215,8.141\
270 c-0.892,0.598-2.059,0.57-2.926-0.061c-0.866-0.629-1.245-1.734-0.949-2.766l4.104-14.365L3.846,22.429\
271 c-0.788-0.71-1.055-1.828-0.676-2.814c0.378-0.987,1.326-1.641,2.385-1.641h13.007l5.036-13.331c0.377-0.989,1.326-1.64,2.384-1.643\
272 h0.003c1.056,0,2.003,0.651,2.384,1.637l5.063,13.337h13.011c1.061,0,2.007,0.652,2.387,1.641c0.38,0.988,0.109,2.104-0.677,2.814\
273 L37.98,31.377l4.104,14.365c0.294,1.031-0.085,2.137-0.947,2.766C40.692,48.834,40.162,49,39.633,49z";
276 check_favorite_init(check_favorite *vd)
278 if (vd->init) return;
279 vd->init = EINA_TRUE;
282 vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
283 evas_vg_node_origin_set(vd->shape[0], 14, 14);
284 evas_vg_shape_stroke_color_set(vd->shape[0], 255, 255, 255, 255);
285 evas_vg_shape_stroke_width_set(vd->shape[0], ELM_VG_SCALE_SIZE(vd->obj, 1.5));
286 evas_vg_shape_append_svg_path(vd->shape[0], star_off);
289 vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
290 evas_vg_node_origin_set(vd->shape[1], 14, 14);
291 evas_vg_shape_append_svg_path(vd->shape[1], star_on);
292 evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
296 transit_check_favorite_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
298 check_favorite *vd = data;
303 _check_favorite(check_favorite *vd, double progress)
305 // star on svg has viewbox as -14 -14 80 80, so the center
306 // of the shape is (80 - 2 *14) = 26
307 double center_x = 26;
308 double center_y = 26;
310 if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
313 eina_matrix3_identity(&m);
314 eina_matrix3_scale(&m, vd->scale_x, vd->scale_y);
315 eina_matrix3_translate(&m, center_x, center_y);
316 eina_matrix3_scale(&m, progress, progress);
317 eina_matrix3_translate(&m, -center_x, -center_y);
318 evas_vg_node_transformation_set(vd->shape[1], &m);
322 transit_check_favorite_op(Elm_Transit_Effect *effect,
323 Elm_Transit *transit EINA_UNUSED, double progress)
325 check_favorite *vd = effect;
326 _check_favorite(vd, progress);
330 _transit_check_favorite_animation_finished(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
332 check_favorite *vd = effect;
334 elm_layout_signal_emit(vd->obj, "elm,action,animation,finished", "elm");
338 check_favorite_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
339 Evas_Object *obj EINA_UNUSED,
340 void *event_info EINA_UNUSED)
343 check_favorite *vd = data;
344 check_favorite_init(vd);
345 // star on svg has viewbox as -14 -14 80 80, so the origin
350 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
351 vd->scale_x = w/80.0;
352 vd->scale_y = h/80.0;
354 originx = originx * vd->scale_x;
355 originy = originy * vd->scale_y;
358 evas_vg_node_origin_set(vd->shape[0], originx, originy);
359 evas_vg_node_origin_set(vd->shape[1], originx, originy);
361 // apply it to outline star
363 eina_matrix3_identity(&m);
364 eina_matrix3_scale(&m, vd->scale_x, vd->scale_y);
365 evas_vg_node_transformation_set(vd->shape[0], &m);
367 // update the inner star
368 _check_favorite(vd, 1);
372 check_favorite_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
373 const char *emission EINA_UNUSED,
374 const char *source EINA_UNUSED)
376 check_favorite *vd = data;
378 if (strcmp(source, "tizen_vg")) return;
380 check_favorite_init(vd);
382 Eina_Bool check = elm_check_state_get(obj);
385 elm_transit_del(vd->transit);
386 vd->transit = elm_transit_add();
387 elm_transit_effect_add(vd->transit, transit_check_favorite_op, vd,
388 _transit_check_favorite_animation_finished);
389 elm_transit_del_cb_set(vd->transit, transit_check_favorite_del_cb, vd);
390 elm_transit_tween_mode_set(vd->transit,
391 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
394 elm_transit_duration_set(vd->transit, 0.3);
395 elm_transit_go_in(vd->transit, 0.1);
399 elm_transit_duration_set(vd->transit, 0.3);
400 elm_transit_go(vd->transit);
405 check_favorite_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
406 const char *emission EINA_UNUSED,
407 const char *source EINA_UNUSED)
409 check_favorite *vd = data;
411 if (strcmp(source, "tizen_vg")) return;
413 check_favorite_init(vd);
415 _check_favorite(vd, 1.0);
419 check_favorite_del_cb(void *data, Evas *e EINA_UNUSED,
420 Evas_Object *obj EINA_UNUSED,
421 void *event_info EINA_UNUSED)
423 check_favorite *vd = data;
424 evas_object_data_set(vd->obj, vg_key, NULL);
425 elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_favorite_state_toggle_cb);
426 elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_favorite_action_toggle_cb);
427 elm_transit_del(vd->transit);
428 evas_object_del(vd->vg[1]);
433 tizen_vg_check_favorite_set(Elm_Check *obj)
435 check_favorite *vd = calloc(1, sizeof(check_favorite));
438 ERR("Failed to allocate vector graphics data memory");
441 evas_object_data_set(obj, vg_key, vd);
442 elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_favorite_state_toggle_cb, vd);
443 elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_favorite_action_toggle_cb, vd);
447 vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
448 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
449 check_favorite_del_cb, vd);
450 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
451 check_favorite_vg_resize_cb, vd);
453 vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
455 elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
456 elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
460 /////////////////////////////////////////////////////////////////////////
462 /////////////////////////////////////////////////////////////////////////
463 typedef struct check_onoff_s
465 Evas_Object *vg[3]; //0: bg, 1: overlapped circle, 2: line-circle
466 Efl_VG_Shape *shape[4]; //0: bg, 1: overlapped circle, 2: line, 3: circle
467 Elm_Transit *transit[3]; //0: circle, 1: line, 2: overlapped circle
474 check_onoff_init(check_onoff *vd)
476 if (vd->init) return;
477 vd->init = EINA_TRUE;
480 vd->shape[0] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[0]));
481 evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
484 vd->shape[1] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[1]));
485 evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
488 vd->shape[2] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
489 evas_vg_shape_stroke_color_set(vd->shape[2], 255, 255, 255, 255);
490 evas_vg_shape_stroke_width_set(vd->shape[2], ELM_VG_SCALE_SIZE(vd->obj, 3));
491 evas_vg_shape_stroke_cap_set(vd->shape[2], EFL_GFX_CAP_ROUND);
494 vd->shape[3] = evas_vg_shape_add(evas_object_vg_root_node_get(vd->vg[2]));
495 evas_vg_shape_stroke_color_set(vd->shape[3], 255, 255, 255, 255);
496 evas_vg_shape_stroke_width_set(vd->shape[3], ELM_VG_SCALE_SIZE(vd->obj, 3));
500 _check_onoff_circle(check_onoff *vd, double progress)
503 evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
504 double center_x = ((double)w / 2);
505 double center_y = ((double)h / 2);
507 evas_vg_shape_reset(vd->shape[3]);
509 double radius = (center_x < center_y ? center_x : center_y) -
510 (ELM_VG_SCALE_SIZE(vd->obj, 3));
512 if (elm_check_state_get(vd->obj)) progress = 1 - progress;
514 evas_vg_shape_append_circle(vd->shape[3], center_x, center_y,
519 transit_check_onoff_circle_op(Elm_Transit_Effect *effect,
520 Elm_Transit *transit EINA_UNUSED, double progress)
522 check_onoff *vd = effect;
523 _check_onoff_circle(vd, progress);
527 transit_check_onoff_circle_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
529 check_onoff *vd = data;
530 vd->transit[0] = NULL;
534 _check_onoff_line(check_onoff *vd, double progress)
537 evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
538 double center_x = ((double)w / 2);
539 double center_y = ((double)h / 2);
541 evas_vg_shape_reset(vd->shape[2]);
543 if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
545 double diff = center_y - ELM_VG_SCALE_SIZE(vd->obj, 3) - 1;
547 evas_vg_shape_append_move_to(vd->shape[2], center_x,
548 (center_y - (diff * progress)));
549 evas_vg_shape_append_line_to(vd->shape[2], center_x,
550 (center_y + (diff * progress)));
554 transit_check_onoff_line_op(void *data, Elm_Transit *transit EINA_UNUSED,
557 check_onoff *vd = data;
558 _check_onoff_line(vd, progress);
562 _transit_check_onoff_animation_finished(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
564 check_onoff *vd = effect;
566 elm_layout_signal_emit(vd->obj, "elm,action,animation,finished", "elm");
570 transit_check_onoff_line_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
572 check_onoff *vd = data;
573 vd->transit[1] = NULL;
577 _check_onoff_sizing(check_onoff *vd, double progress)
579 check_onoff_init(vd);
582 evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
583 double center_x = ((double)w / 2);
584 double center_y = ((double)h / 2);
586 if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
589 evas_vg_shape_reset(vd->shape[1]);
590 evas_vg_shape_append_circle(vd->shape[1],
592 (0.7 + progress) * center_x);
596 transit_check_onoff_sizing_op(void *data, Elm_Transit *transit EINA_UNUSED,
599 check_onoff *vd = data;
600 _check_onoff_sizing(vd, progress);
604 transit_check_onoff_sizing_del_cb(void *data,
605 Elm_Transit *transit EINA_UNUSED)
607 check_onoff *vd = data;
608 vd->transit[2] = NULL;
612 check_onoff_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
613 const char *emission EINA_UNUSED,
614 const char *source EINA_UNUSED)
616 check_onoff *vd = data;
618 if (strcmp(source, "tizen_vg")) return;
620 check_onoff_init(vd);
622 Eina_Bool check = elm_check_state_get(obj);
625 elm_transit_del(vd->transit[0]);
626 vd->transit[0] = elm_transit_add();
627 elm_transit_effect_add(vd->transit[0], transit_check_onoff_circle_op, vd,
629 elm_transit_del_cb_set(vd->transit[0], transit_check_onoff_circle_del_cb,
631 elm_transit_tween_mode_set(vd->transit[0],
632 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
635 elm_transit_duration_set(vd->transit[0], 0.1);
636 elm_transit_go(vd->transit[0]);
640 elm_transit_duration_set(vd->transit[0], 0.25);
641 elm_transit_go_in(vd->transit[0], 0.05);
645 elm_transit_del(vd->transit[1]);
646 vd->transit[1] = elm_transit_add();
647 elm_transit_effect_add(vd->transit[1], transit_check_onoff_line_op, vd,
649 elm_transit_del_cb_set(vd->transit[1], transit_check_onoff_line_del_cb,
651 elm_transit_tween_mode_set(vd->transit[1],
652 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
655 elm_transit_duration_set(vd->transit[1], 0.25);
656 elm_transit_go_in(vd->transit[1], 0.05);
658 //Overlap Circle Sizing Effect
659 elm_transit_del(vd->transit[2]);
660 vd->transit[2] = elm_transit_add();
661 elm_transit_effect_add(vd->transit[2], transit_check_onoff_sizing_op, vd,
662 _transit_check_onoff_animation_finished);
663 elm_transit_del_cb_set(vd->transit[2], transit_check_onoff_sizing_del_cb,
665 elm_transit_tween_mode_set(vd->transit[2],
666 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
667 elm_transit_duration_set(vd->transit[2], 0.3);
668 elm_transit_go(vd->transit[2]);
672 elm_transit_duration_set(vd->transit[1], 0.1);
673 elm_transit_go(vd->transit[1]);
678 check_onoff_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
679 const char *emission EINA_UNUSED,
680 const char *source EINA_UNUSED)
682 check_onoff *vd = data;
684 if (strcmp(source, "tizen_vg")) return;
686 check_onoff_init(vd);
688 _check_onoff_circle(vd, 1.0);
689 _check_onoff_line(vd, 1.0);
690 _check_onoff_sizing(vd, 1.0);
694 check_onoff_del_cb(void *data, Evas *e EINA_UNUSED,
695 Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
697 check_onoff *vd = data;
698 evas_object_data_set(vd->obj, vg_key, NULL);
699 elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_onoff_state_toggle_cb);
700 elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_onoff_action_toggle_cb);
701 elm_transit_del(vd->transit[0]);
702 elm_transit_del(vd->transit[1]);
703 elm_transit_del(vd->transit[2]);
704 evas_object_del(vd->vg[1]);
705 evas_object_del(vd->vg[2]);
710 check_onoff_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
711 Evas_Object *obj EINA_UNUSED,
712 void *event_info EINA_UNUSED)
714 check_onoff *vd = data;
716 check_onoff_init(vd);
719 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
720 Evas_Coord center_x = (w / 2);
721 Evas_Coord center_y = (h / 2);
723 evas_vg_shape_reset(vd->shape[0]);
724 evas_vg_shape_append_circle(vd->shape[0], center_x, center_y,
729 check_onoff_vg2_resize_cb(void *data, Evas *e EINA_UNUSED,
730 Evas_Object *obj EINA_UNUSED,
731 void *event_info EINA_UNUSED)
733 check_onoff *vd = data;
735 check_onoff_init(vd);
738 evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
739 double center_x = ((double)w / 2);
740 double center_y = ((double)h / 2);
742 evas_vg_shape_reset(vd->shape[1]);
743 evas_vg_shape_append_circle(vd->shape[1],
749 check_onoff_vg3_resize_cb(void *data, Evas *e EINA_UNUSED,
750 Evas_Object *obj EINA_UNUSED,
751 void *event_info EINA_UNUSED)
753 check_onoff *vd = data;
755 check_onoff_init(vd);
758 evas_object_geometry_get(vd->vg[2], NULL, NULL, &w, &h);
759 double center_x = ((double)w / 2);
760 double center_y = ((double)h / 2);
762 evas_vg_shape_reset(vd->shape[2]);
763 evas_vg_shape_reset(vd->shape[3]);
766 if (elm_check_state_get(vd->obj))
768 double diff = ELM_VG_SCALE_SIZE(vd->obj, 3) - 1;
770 evas_vg_shape_append_move_to(vd->shape[2], center_x, diff);
771 evas_vg_shape_append_line_to(vd->shape[2], center_x, h - diff);
776 double radius = (center_x < center_y ? center_x : center_y) -
777 (ELM_VG_SCALE_SIZE(vd->obj, 3));
778 evas_vg_shape_append_circle(vd->shape[3],
779 center_x, center_y, radius);
784 tizen_vg_check_onoff_set(Elm_Check *obj)
786 check_onoff *vd = calloc(1, sizeof(check_onoff));
789 ERR("Failed to allocate vector graphics data memory");
792 evas_object_data_set(obj, vg_key, vd);
794 elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_onoff_state_toggle_cb, vd);
795 elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_onoff_action_toggle_cb, vd);
800 vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
801 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
802 check_onoff_del_cb, vd);
803 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
804 check_onoff_vg_resize_cb, vd);
805 //Overlapped Circle VG
806 vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
807 evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
808 check_onoff_vg2_resize_cb, vd);
810 vd->vg[2] = evas_object_vg_add(evas_object_evas_get(obj));
811 evas_object_event_callback_add(vd->vg[2], EVAS_CALLBACK_RESIZE,
812 check_onoff_vg3_resize_cb, vd);
814 elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
815 elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
816 elm_object_part_content_set(obj, "tizen_vg_shape3", vd->vg[2]);
821 /////////////////////////////////////////////////////////////////////////
823 /////////////////////////////////////////////////////////////////////////
824 typedef struct check_default_s
826 Evas_Object *vg[3]; //0: base, 1: line 2: bg
827 Efl_VG_Shape *shape[5]; //0: outline, 1: bg, 2: left line, 3: right line 4: bg
828 Elm_Transit *transit[3]; //0: bg color, 1: bg scale, 2: check lines
830 double left_move_to[2];
831 double left_line_to[2];
832 double right_move_to[2];
833 double right_line_to[2];
837 static const char *check_default_fill = "M7.279,2h35.442C45.637,2,48,4.359,48,7.271v35.455\
838 C48,45.639,45.637,48,42.723,48H7.279C4.362,47.997,2,45.639,2,42.727 V7.271C2,4.359,4.362,2,7.279,2z";
840 static const char *check_default_outline= "M7.32,2.5h35.361c2.662,0,4.818,2.159,4.818,4.82\
841 v35.361c0,2.663-2.156,4.819-4.818,4.819H7.32c-2.661,0-4.82-2.156-4.82-4.82V7.32C2.5,4.659,4.659,2.5,7.32,2.5z";
844 check_default_init(check_default *vd)
846 if (vd->init) return;
847 vd->init = EINA_TRUE;
850 Efl_VG *bg_root = evas_object_vg_root_node_get(vd->vg[2]);
851 vd->shape[4] = evas_vg_shape_add(bg_root);
854 Efl_VG *base_root = evas_object_vg_root_node_get(vd->vg[0]);
856 vd->shape[0] = evas_vg_shape_add(base_root);
858 vd->shape[1] = evas_vg_shape_add(base_root);
861 Efl_VG *line_root = evas_object_vg_root_node_get(vd->vg[1]);
863 vd->shape[2] = evas_vg_shape_add(line_root);
864 evas_vg_shape_stroke_width_set(vd->shape[2], ELM_VG_SCALE_SIZE(vd->obj, 1.75));
865 evas_vg_shape_stroke_color_set(vd->shape[2], 255, 255, 255, 255);
866 evas_vg_shape_stroke_cap_set(vd->shape[2], EFL_GFX_CAP_ROUND);
869 vd->shape[3] = evas_vg_shape_add(line_root);
870 evas_vg_shape_stroke_width_set(vd->shape[3], ELM_VG_SCALE_SIZE(vd->obj, 1.75));
871 evas_vg_shape_stroke_color_set(vd->shape[3], 255, 255, 255, 255);
872 evas_vg_shape_stroke_cap_set(vd->shape[3], EFL_GFX_CAP_ROUND);
874 vd->left_move_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -5);
875 vd->left_move_to[1] = ELM_VG_SCALE_SIZE(vd->obj, 10);
876 vd->left_line_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -8);
877 vd->left_line_to[1] = ELM_VG_SCALE_SIZE(vd->obj, -8);
879 vd->right_move_to[0] = ELM_VG_SCALE_SIZE(vd->obj, -5);
880 vd->right_move_to[1] = ELM_VG_SCALE_SIZE(vd->obj, 10);
881 vd->right_line_to[0] = ELM_VG_SCALE_SIZE(vd->obj, 18);
882 vd->right_line_to[1] = ELM_VG_SCALE_SIZE(vd->obj, -18);
886 _update_default_check_shape(check_default *vd EINA_UNUSED, Efl_VG *shape, Eina_Bool outline, Eo *obj)
891 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
892 double scale_x = w / 50.0;
893 double scale_y = h / 50.0;
894 eina_matrix3_identity(&m);
895 eina_matrix3_scale(&m, scale_x, scale_y);
896 evas_vg_shape_reset(shape);
900 evas_vg_shape_append_svg_path(shape, check_default_outline);
901 if (eina_matrix3_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY)
902 evas_vg_node_transformation_set(shape, &m);
904 evas_vg_shape_stroke_width_set(shape, 1.5);
906 evas_vg_node_color_set(shape, 0, 0, 0, 0);
907 evas_vg_shape_stroke_color_set(shape, 255, 255, 255, 255);
912 evas_vg_shape_append_svg_path(shape, check_default_fill);
913 if (eina_matrix3_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY)
914 evas_vg_node_transformation_set(shape, &m);
917 evas_vg_node_color_set(shape, 255, 255, 255, 255);
918 evas_vg_shape_stroke_color_set(shape, 0, 0, 0, 0);
923 check_default_vg_bg_resize_cb(void *data, Evas *e EINA_UNUSED,
924 Evas_Object *obj EINA_UNUSED,
925 void *event_info EINA_UNUSED)
927 check_default *vd = data;
928 check_default_init(vd);
929 _update_default_check_shape(vd, vd->shape[4], elm_check_state_get(vd->obj), vd->vg[2]);
933 check_default_vg_resize_cb(void *data, Evas *e EINA_UNUSED,
934 Evas_Object *obj EINA_UNUSED,
935 void *event_info EINA_UNUSED)
937 check_default *vd = data;
939 check_default_init(vd);
942 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
943 double center_x = ((double)w / 2);
944 double center_y = ((double)h / 2);
946 //Update Outline Shape
947 _update_default_check_shape(vd, vd->shape[0], EINA_TRUE, vd->vg[0]);
950 _update_default_check_shape(vd, vd->shape[1], EINA_FALSE, vd->vg[0]);
952 if (elm_check_state_get(vd->obj))
953 evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
955 evas_vg_node_color_set(vd->shape[1], 0, 0, 0, 0);
958 if (elm_check_state_get(vd->obj))
961 evas_vg_shape_reset(vd->shape[2]);
962 evas_vg_shape_append_move_to(vd->shape[2],
963 center_x + vd->left_move_to[0],
964 center_y + vd->left_move_to[1]);
965 evas_vg_shape_append_line_to(vd->shape[2],
966 (center_x + vd->left_move_to[0]) +
967 (vd->left_line_to[0]),
968 (center_y + vd->left_move_to[1]) +
969 (vd->left_line_to[1]));
971 evas_vg_shape_reset(vd->shape[3]);
972 evas_vg_shape_append_move_to(vd->shape[3],
973 center_x + vd->right_move_to[0],
974 center_y + vd->right_move_to[1]);
975 evas_vg_shape_append_line_to(vd->shape[3],
976 (center_x + vd->right_move_to[0]) +
977 (vd->right_line_to[0]),
978 (center_y + vd->right_move_to[1]) +
979 (vd->right_line_to[1]));
984 transit_check_default_bg_color_del_cb(Elm_Transit_Effect *effect,
985 Elm_Transit *transit EINA_UNUSED)
987 check_default *vd = effect;
988 vd->transit[0] = NULL;
993 _check_default_bg_color(check_default *vd, double progress)
997 if (elm_check_state_get(vd->obj)) color = 255 * progress;
998 else color = 255 * (1 - progress);
1000 evas_vg_node_color_set(vd->shape[1], color, color, color, color);
1001 evas_vg_shape_stroke_color_set(vd->shape[0], 255 - color, 255 - color, 255 - color, 255 -color);
1005 transit_check_default_bg_color_op(Elm_Transit_Effect *effect,
1006 Elm_Transit *transit EINA_UNUSED,
1009 check_default *vd = effect;
1010 _check_default_bg_color(vd, progress);
1014 _transit_check_default_animation_finished(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
1016 check_default *vd = effect;
1018 elm_layout_signal_emit(vd->obj, "elm,action,animation,finished", "elm");
1022 transit_check_default_bg_scale_del_cb(Elm_Transit_Effect *effect,
1023 Elm_Transit *transit EINA_UNUSED)
1025 check_default *vd = effect;
1026 vd->transit[1] = NULL;
1030 _check_default_bg_scale(check_default *vd, double progress)
1032 // as the viewbox of the check_on svg is 0 0 50 50
1033 // center of the svg is 25 25
1035 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
1036 double scale_x = w/50.0;
1037 double scale_y = h/50.0;
1040 eina_matrix3_identity(&m);
1041 eina_matrix3_scale(&m, scale_x, scale_y);
1042 eina_matrix3_translate(&m, 25, 25);
1043 eina_matrix3_scale(&m, progress, progress);
1044 eina_matrix3_translate(&m, -25, -25);
1045 evas_vg_node_transformation_set(vd->shape[1], &m);
1048 transit_check_default_bg_scale_op(Elm_Transit_Effect *effect,
1049 Elm_Transit *transit EINA_UNUSED,
1052 check_default *vd = effect;
1053 _check_default_bg_scale(vd, progress);
1057 transit_check_default_line_del_cb(Elm_Transit_Effect *effect,
1058 Elm_Transit *transit EINA_UNUSED)
1060 check_default *vd = effect;
1061 vd->transit[2] = NULL;
1065 _check_default_line(check_default *vd, double progress)
1068 evas_object_geometry_get(vd->vg[1], NULL, NULL, &w, &h);
1069 double center_x = ((double)w / 2);
1070 double center_y = ((double)h / 2);
1073 if (!elm_check_state_get(vd->obj)) progress = 1 - progress;
1076 evas_vg_shape_reset(vd->shape[2]);
1077 evas_vg_shape_append_move_to(vd->shape[2],
1078 center_x + vd->left_move_to[0],
1079 center_y + vd->left_move_to[1]);
1080 evas_vg_shape_append_line_to(vd->shape[2],
1081 (center_x + vd->left_move_to[0]) +
1082 (vd->left_line_to[0] * progress),
1083 (center_y + vd->left_move_to[1]) +
1084 (vd->left_line_to[1] * progress));
1087 evas_vg_shape_reset(vd->shape[3]);
1088 evas_vg_shape_append_move_to(vd->shape[3],
1089 center_x + vd->right_move_to[0],
1090 center_y + vd->right_move_to[1]);
1091 evas_vg_shape_append_line_to(vd->shape[3],
1092 (center_x + vd->right_move_to[0]) +
1093 (vd->right_line_to[0] * progress),
1094 (center_y + vd->right_move_to[1]) +
1095 (vd->right_line_to[1] * progress));
1099 transit_check_default_line_op(Elm_Transit_Effect *effect,
1100 Elm_Transit *transit EINA_UNUSED, double progress)
1102 check_default *vd = effect;
1103 _check_default_line(vd, progress);
1107 check_default_action_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
1108 const char *emission EINA_UNUSED,
1109 const char *source EINA_UNUSED)
1111 check_default *vd = data;
1112 if (!source) return;
1113 if (strcmp(source, "tizen_vg")) return;
1115 check_default_init(vd);
1117 Eina_Bool check = elm_check_state_get(obj);
1120 elm_transit_del(vd->transit[0]);
1121 vd->transit[0] = elm_transit_add();
1122 elm_transit_effect_add(vd->transit[0], transit_check_default_bg_color_op, vd,
1123 _transit_check_default_animation_finished);
1124 elm_transit_del_cb_set(vd->transit[0], transit_check_default_bg_color_del_cb,
1126 elm_transit_tween_mode_set(vd->transit[0],
1127 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
1131 elm_transit_duration_set(vd->transit[0], 0.3);
1132 elm_transit_go(vd->transit[0]);
1136 elm_transit_duration_set(vd->transit[0], 0.2);
1137 elm_transit_go_in(vd->transit[0], 0.15);
1141 elm_transit_del(vd->transit[1]);
1145 vd->transit[1] = elm_transit_add();
1146 elm_transit_effect_add(vd->transit[1],
1147 transit_check_default_bg_scale_op, vd, NULL);
1148 elm_transit_del_cb_set(vd->transit[1],
1149 transit_check_default_bg_scale_del_cb, vd);
1150 elm_transit_tween_mode_set(vd->transit[1],
1151 ELM_TRANSIT_TWEEN_MODE_DECELERATE);
1152 elm_transit_duration_set(vd->transit[1], 0.15);
1153 elm_transit_go(vd->transit[1]);
1157 elm_transit_del(vd->transit[2]);
1159 vd->transit[2] = elm_transit_add();
1160 elm_transit_effect_add(vd->transit[2], transit_check_default_line_op, vd,
1162 elm_transit_del_cb_set(vd->transit[2], transit_check_default_line_del_cb,
1164 elm_transit_tween_mode_set(vd->transit[2],
1165 ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL);
1166 elm_transit_duration_set(vd->transit[2], 0.15);
1169 elm_transit_go_in(vd->transit[2], 0.15);
1171 elm_transit_go(vd->transit[2]);
1173 _update_default_check_shape(vd, vd->shape[4], elm_check_state_get(vd->obj), vd->vg[2]);
1177 check_default_state_toggle_cb(void *data, Evas_Object *obj EINA_UNUSED,
1178 const char *emission EINA_UNUSED,
1179 const char *source EINA_UNUSED)
1181 check_default *vd = data;
1182 if (!source) return;
1183 if (strcmp(source, "tizen_vg")) return;
1185 check_default_init(vd);
1187 _check_default_bg_color(vd, 1.0);
1188 _check_default_bg_scale(vd, 1.0);
1189 _check_default_line(vd, 1.0);
1190 _update_default_check_shape(vd, vd->shape[4], elm_check_state_get(vd->obj), vd->vg[2]);
1192 // update outline color
1193 if (elm_check_state_get(vd->obj))
1194 evas_vg_shape_stroke_color_set(vd->shape[0], 0, 0, 0, 0);
1196 evas_vg_shape_stroke_color_set(vd->shape[0], 255, 255, 255, 255);
1200 check_default_del_cb(void *data, Evas *e EINA_UNUSED,
1201 Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1203 check_default *vd = data;
1204 evas_object_data_set(vd->obj, vg_key, NULL);
1205 elm_object_signal_callback_del(vd->obj, "elm,check,state,toggle", "tizen_vg", check_default_state_toggle_cb);
1206 elm_object_signal_callback_del(vd->obj, "elm,check,action,toggle", "tizen_vg", check_default_action_toggle_cb);
1207 elm_transit_del(vd->transit[0]);
1208 elm_transit_del(vd->transit[1]);
1209 elm_transit_del(vd->transit[2]);
1210 evas_object_del(vd->vg[1]);
1211 evas_object_del(vd->vg[2]);
1216 tizen_vg_check_default_set(Elm_Check *obj)
1218 check_default *vd = calloc(1, sizeof(check_default));
1221 ERR("Failed to allocate vector graphics data memory");
1224 evas_object_data_set(obj, vg_key, vd);
1226 elm_object_signal_callback_add(obj, "elm,check,state,toggle", "tizen_vg", check_default_state_toggle_cb, vd);
1227 elm_object_signal_callback_add(obj, "elm,check,action,toggle", "tizen_vg", check_default_action_toggle_cb, vd);
1232 vd->vg[2] = evas_object_vg_add(evas_object_evas_get(obj));
1233 evas_object_event_callback_add(vd->vg[2], EVAS_CALLBACK_RESIZE,
1234 check_default_vg_bg_resize_cb, vd);
1237 vd->vg[0] = evas_object_vg_add(evas_object_evas_get(obj));
1238 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1239 check_default_del_cb, vd);
1240 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1241 check_default_vg_resize_cb, vd);
1243 vd->vg[1] = evas_object_vg_add(evas_object_evas_get(obj));
1245 elm_object_part_content_set(obj, "tizen_vg_shape_bg", vd->vg[2]);
1246 elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
1247 elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
1251 tizen_vg_check_set(Elm_Check *obj)
1253 check_default *vd = evas_object_data_get(obj, vg_key);
1254 if (vd) evas_object_del(vd->vg[0]);
1256 //Apply vector ux only theme has "vector_ux"
1257 const char *str = elm_layout_data_get(obj, "vector_ux");
1260 if (!strcmp(str, "default"))
1261 tizen_vg_check_default_set(obj);
1262 else if (!strcmp(str, "on&off"))
1263 tizen_vg_check_onoff_set(obj);
1264 else if (!strcmp(str, "favorite"))
1265 tizen_vg_check_favorite_set(obj);
1269 tizen_vg_check_state_set(Elm_Check *obj)
1271 // Fix for the state change visual change skips one frame.
1272 // For vector enabled checkbox , state change visual change is handled in the
1273 // code and it depends on "elm,check,action,toggle" signal.
1274 // as edje signal emit is asyn force one more message_signal to make sure
1275 // state change related visual change occurs in the same frame.
1276 edje_object_message_signal_process(elm_layout_edje_get(obj));
1279 /////////////////////////////////////////////////////////////////////////
1281 /////////////////////////////////////////////////////////////////////////
1282 typedef struct vg_button_s
1284 Evas_Object *vg[2]; //0: base, 1: effect
1285 Efl_VG_Shape *shape[2]; //0: base, 1: effect
1289 Eina_Bool is_circle : 1;
1293 button_no_bg_init(vg_button *vd)
1295 if (vd->init) return;
1296 vd->init = EINA_TRUE;
1299 Efl_VG *effect_root = evas_object_vg_root_node_get(vd->vg[0]);
1300 vd->shape[0] = evas_vg_shape_add(effect_root);
1301 evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
1305 button_effect_no_bg_resize_cb(void *data, Evas *e EINA_UNUSED,
1306 Evas_Object *obj EINA_UNUSED,
1307 void *event_info EINA_UNUSED)
1309 vg_button *vd = data;
1311 button_no_bg_init(vd);
1313 //Update Effect Shape
1314 Evas_Coord x, y, w, h;
1315 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1316 evas_vg_shape_reset(vd->shape[0]);
1319 double radius_w = w / 2.0;
1320 double radius_h = h / 2.0;
1321 evas_vg_shape_append_circle(vd->shape[0], radius_w, radius_h, radius_w);
1326 double effect_ratio;
1328 if (!edje_object_part_geometry_get(elm_layout_edje_get(vd->obj), "effect_spacer", NULL, NULL, &w2, &h2))
1329 evas_object_geometry_get(vd->obj, NULL, NULL, &w2, &h2);
1330 effect_ratio = (w2 < h2) ? (double)w / w2 : (double)h / h2;
1331 evas_vg_shape_append_rect(vd->shape[0], 0, 0, w, h, vd->corner * effect_ratio, vd->corner * effect_ratio);
1336 button_no_bg_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
1337 void *event_info EINA_UNUSED)
1339 vg_button *vd = data;
1340 evas_object_data_del(vd->obj, vg_key);
1345 tizen_vg_button_no_bg_set(Elm_Button *obj)
1347 vg_button *vd = evas_object_data_get(obj, vg_key);
1350 elm_object_part_content_unset(obj, "tizen_vg_shape");
1351 evas_object_del(vd->vg[0]);
1354 vd = calloc(1, sizeof(vg_button));
1357 ERR("Failed to allocate vector graphics data memory");
1360 evas_object_data_set(obj, vg_key, vd);
1362 //Vector Graphics Object
1363 Evas *e = evas_object_evas_get(obj);
1368 vd->vg[0] = evas_object_vg_add(e);
1369 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1370 button_no_bg_del_cb, vd);
1372 // Check whether the button has circle shape.
1373 // When the button has no background and has circle shape,
1374 // the vector_ux will be "no_bg/circle".
1375 const char *str = elm_layout_data_get(obj, "vector_ux");
1376 if (str && strstr(str, "circle"))
1377 vd->is_circle = EINA_TRUE;
1380 // Since it is not circle, it has rectangle shape.
1381 str = elm_layout_data_get(obj, "corner_radius");
1382 if (str) vd->corner = ELM_VG_SCALE_SIZE(obj, atoi(str));
1385 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1386 button_effect_no_bg_resize_cb, vd);
1388 elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
1392 button_init(vg_button *vd)
1394 if (vd->init) return;
1395 vd->init = EINA_TRUE;
1398 Efl_VG *base_root = evas_object_vg_root_node_get(vd->vg[0]);
1399 vd->shape[0] = evas_vg_shape_add(base_root);
1400 evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
1403 Efl_VG *effect_root = evas_object_vg_root_node_get(vd->vg[1]);
1404 vd->shape[1] = evas_vg_shape_add(effect_root);
1405 evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
1409 button_effect_resize_cb(void *data, Evas *e EINA_UNUSED,
1410 Evas_Object *obj EINA_UNUSED,
1411 void *event_info EINA_UNUSED)
1413 vg_button *vd = data;
1417 //Update Effect Shape
1418 Evas_Coord x, y, w, h;
1419 evas_object_geometry_get(vd->vg[1], &x, &y, &w, &h);
1420 evas_vg_shape_reset(vd->shape[1]);
1423 double radius_w = w / 2.0;
1424 double radius_h = h / 2.0;
1425 evas_vg_shape_append_circle(vd->shape[1], radius_w, radius_h, radius_w);
1430 double effect_ratio;
1432 if (!edje_object_part_geometry_get(elm_layout_edje_get(vd->obj), "effect_spacer", NULL, NULL, &w2, &h2))
1433 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w2, &h2);
1434 effect_ratio = (w2 < h2) ? (double)w / w2 : (double)h / h2;
1435 evas_vg_shape_append_rect(vd->shape[1], 0, 0, w, h, vd->corner * effect_ratio, vd->corner * effect_ratio);
1440 button_base_resize_cb(void *data, Evas *e EINA_UNUSED,
1441 Evas_Object *obj EINA_UNUSED,
1442 void *event_info EINA_UNUSED)
1444 vg_button *vd = data;
1450 evas_object_geometry_get(vd->vg[0], NULL, NULL, &w, &h);
1451 evas_vg_shape_reset(vd->shape[0]);
1454 double radius_w = w / 2.0;
1455 double radius_h = h / 2.0;
1456 evas_vg_shape_append_circle(vd->shape[0], radius_w, radius_h, radius_w);
1459 evas_vg_shape_append_rect(vd->shape[0], 0, 0, w, h, vd->corner, vd->corner);
1463 button_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
1464 void *event_info EINA_UNUSED)
1466 vg_button *vd = data;
1467 evas_object_data_del(vd->obj, vg_key);
1468 evas_object_del(vd->vg[1]);
1473 tizen_vg_button_default_set(Elm_Button *obj)
1475 vg_button *vd = evas_object_data_get(obj, vg_key);
1478 elm_object_part_content_unset(obj, "tizen_vg_shape");
1479 elm_object_part_content_unset(obj, "tizen_vg_shape2");
1480 evas_object_del(vd->vg[0]);
1482 vd = calloc(1, sizeof(vg_button));
1485 ERR("Failed to allocate vector graphics data memory");
1488 evas_object_data_set(obj, vg_key, vd);
1490 //Vector Graphics Object
1491 Evas *e = evas_object_evas_get(obj);
1495 // Check whether the button has circle shape.
1496 // When the button has no background and has circle shape,
1497 // the vector_ux will be "no_bg/circle".
1498 const char *str = elm_layout_data_get(obj, "vector_ux");
1499 if (str && strstr(str, "circle"))
1500 vd->is_circle = EINA_TRUE;
1503 // Since it is not circle, it has rectangle shape.
1504 str = elm_layout_data_get(obj, "corner_radius");
1505 if (str) vd->corner = ELM_VG_SCALE_SIZE(obj, atoi(str));
1509 vd->vg[0] = evas_object_vg_add(e);
1510 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_DEL,
1512 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1513 button_base_resize_cb, vd);
1515 vd->vg[1] = evas_object_vg_add(e);
1516 evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
1517 button_effect_resize_cb, vd);
1519 elm_object_part_content_set(obj, "tizen_vg_shape", vd->vg[0]);
1520 elm_object_part_content_set(obj, "tizen_vg_shape2", vd->vg[1]);
1524 tizen_vg_button_set(Elm_Button *obj)
1526 //Apply vector ux only theme has "vector_ux"
1527 const char *str = elm_layout_data_get(obj, "vector_ux");
1530 // Check whether the button has a background.
1531 if (!strncmp(str, "no_bg", strlen("no_bg")))
1532 tizen_vg_button_no_bg_set(obj);
1534 tizen_vg_button_default_set(obj);
1537 /////////////////////////////////////////////////////////////////////////
1539 /////////////////////////////////////////////////////////////////////////
1541 typedef struct vg_progressbar_s
1543 Evas_Object *vg[3]; //0: base, 1: layer1, 2:layer2
1544 Efl_VG_Shape *shape[3]; //0: base, 1: layer1, 2: layer2
1545 Elm_Transit *transit[8];
1547 Evas_Coord x, w, h; // for normal style animation data
1548 double stroke_width;
1551 Ecore_Job *pulse_job;
1552 Eina_Bool continued : 1;
1553 Eina_Bool pulse : 1;
1557 transit0_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1559 vg_progressbar *vd = data;
1560 vd->transit[0] = NULL;
1564 transit1_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1566 vg_progressbar *vd = data;
1567 vd->transit[1] = NULL;
1571 transit2_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1573 vg_progressbar *vd = data;
1574 vd->transit[2] = NULL;
1578 transit3_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1580 vg_progressbar *vd = data;
1581 vd->transit[3] = NULL;
1585 transit4_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1587 vg_progressbar *vd = data;
1588 vd->transit[4] = NULL;
1592 transit5_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1594 vg_progressbar *vd = data;
1595 vd->transit[5] = NULL;
1599 transit6_progress_del_cb(void *data, Elm_Transit *transit EINA_UNUSED)
1601 vg_progressbar *vd = data;
1602 vd->transit[6] = NULL;
1606 _pulse_stop(vg_progressbar *vd)
1610 vd->pulse = EINA_FALSE;
1612 for (i = 0; i < 8 ; i++)
1614 elm_transit_del(vd->transit[i]);
1615 vd->transit[i] = NULL;
1618 // delete if any pul_job is scheduled.
1620 ecore_job_del(vd->pulse_job);
1621 vd->pulse_job = NULL;
1625 progressbar_hide_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
1626 void *event_info EINA_UNUSED)
1632 transit_progressbar_normal_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1634 vg_progressbar *vd = effect;
1636 evas_vg_node_color_set(vd->shape[1], 255, 255, 255, 255);
1637 evas_vg_shape_reset(vd->shape[1]);
1638 Evas_Coord start_width = vd->x + vd->h;
1639 evas_vg_shape_append_rect(vd->shape[1], 0, 0, start_width + (vd->w - start_width)* progress, vd->h, vd->h/2, vd->h/2);
1641 evas_vg_node_color_set(vd->shape[2], 255, 255, 255, 255);
1642 evas_vg_shape_reset(vd->shape[2]);
1643 Evas_Coord delta_width = (vd->w - vd->x - vd->h) * progress;
1644 evas_vg_shape_append_rect(vd->shape[2], vd->x, 0, vd->h + delta_width, vd->h, vd->h/2, vd->h/2);
1649 transit_progressbar_normal_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1651 vg_progressbar *vd = effect;
1652 evas_vg_node_color_set(vd->shape[2], 255, 255, 255, 255);
1653 evas_vg_shape_reset(vd->shape[2]);
1654 Evas_Coord delta_move = (vd->w - vd->x - vd->h) * progress;
1655 evas_vg_shape_append_rect(vd->shape[2], vd->x + delta_move, 0, vd->w - vd->x - delta_move, vd->h, vd->h/2, vd->h/2);
1659 transit_progressbar_normal_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1661 vg_progressbar *vd = effect;
1662 int c = 255 - 255*progress;
1663 evas_vg_node_color_set(vd->shape[2], c, c, c, c);
1667 _transit_progressbar_normal_animation_finished(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
1669 vg_progressbar *vd = effect;
1670 vd->transit[2] = NULL;
1672 vd->continued = EINA_FALSE;
1674 elm_layout_signal_emit(vd->obj, "elm,action,animation,finished", "elm");
1678 progressbar_normal_bg_resize_cb(void *data , Evas *e EINA_UNUSED,
1679 Evas_Object *obj EINA_UNUSED,
1680 void *event_info EINA_UNUSED)
1682 Evas_Coord x, y, w, h;
1683 vg_progressbar *vd = data;
1684 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1685 evas_vg_node_color_set(vd->shape[0], 255, 255, 255, 255);
1686 evas_vg_shape_reset(vd->shape[0]);
1687 evas_vg_shape_append_rect(vd->shape[0], 0, 0, w, h, h/2, h/2);
1691 progressbar_normal_fg_resize_cb(void *data, Evas *e EINA_UNUSED,
1692 Evas_Object *obj EINA_UNUSED,
1693 void *event_info EINA_UNUSED)
1695 Evas_Coord x, y, w, h;
1696 static double ease_out_factor[4] = {0.25, 0.46, 0.45, 1.0};
1697 vg_progressbar *vd = data;
1698 evas_object_geometry_get(vd->vg[1], &x, &y, &w, &h);
1701 if (vd->w >= w) vd->x = 0;
1702 else vd->x = vd->w - vd->h;
1705 elm_transit_del(vd->transit[0]);
1706 vd->transit[0] = elm_transit_add();
1707 elm_transit_effect_add(vd->transit[0], transit_progressbar_normal_op1, vd, transit0_progress_del_cb);
1708 elm_transit_tween_mode_set(vd->transit[0], ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE);
1709 elm_transit_tween_mode_factor_n_set(vd->transit[0], 4, ease_out_factor);
1710 elm_transit_duration_set(vd->transit[0], 0.8);
1711 elm_transit_objects_final_state_keep_set(vd->transit[0], EINA_TRUE);
1713 elm_transit_del(vd->transit[1]);
1714 vd->transit[1] = elm_transit_add();
1715 elm_transit_effect_add(vd->transit[1], transit_progressbar_normal_op2, vd, transit1_progress_del_cb);
1716 elm_transit_tween_mode_set(vd->transit[1], ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE);
1717 elm_transit_tween_mode_factor_n_set(vd->transit[1], 4, ease_out_factor);
1718 elm_transit_duration_set(vd->transit[1], 0.7);
1719 elm_transit_objects_final_state_keep_set(vd->transit[1], EINA_TRUE);
1721 if (vd->transit[2]) vd->continued = EINA_TRUE;
1723 elm_transit_del(vd->transit[2]);
1724 vd->transit[2] = elm_transit_add();
1725 elm_transit_effect_add(vd->transit[2], transit_progressbar_normal_op3, vd, _transit_progressbar_normal_animation_finished);
1726 elm_transit_tween_mode_set(vd->transit[2], ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE);
1727 elm_transit_tween_mode_factor_n_set(vd->transit[2], 4, ease_out_factor);
1728 elm_transit_duration_set(vd->transit[2], 0.3);
1729 elm_transit_objects_final_state_keep_set(vd->transit[2], EINA_TRUE);
1731 elm_transit_chain_transit_add(vd->transit[0], vd->transit[1]);
1732 elm_transit_chain_transit_add(vd->transit[1], vd->transit[2]);
1734 elm_transit_go(vd->transit[0]);
1739 _progressbar_normal_style(vg_progressbar *vd)
1743 Evas *e = evas_object_evas_get(vd->obj);
1745 for(i=0; i < 3; i++)
1747 vd->vg[i] = evas_object_vg_add(e);
1748 root = evas_object_vg_root_node_get(vd->vg[i]);
1749 vd->shape[i] = evas_vg_shape_add(root);
1752 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
1753 progressbar_normal_bg_resize_cb, vd);
1754 evas_object_event_callback_add(vd->vg[1], EVAS_CALLBACK_RESIZE,
1755 progressbar_normal_fg_resize_cb, vd);
1758 elm_object_part_content_unset(vd->obj, "tizen_vg_shape1");
1759 elm_object_part_content_unset(vd->obj, "tizen_vg_shape2");
1760 elm_object_part_content_unset(vd->obj, "tizen_vg_shape3");
1762 elm_object_part_content_set(vd->obj, "tizen_vg_shape1", vd->vg[0]);
1763 elm_object_part_content_set(vd->obj, "tizen_vg_shape2", vd->vg[1]);
1764 elm_object_part_content_set(vd->obj, "tizen_vg_shape3", vd->vg[2]);
1768 progressbar_process_resize_cb(void *data , Evas *e EINA_UNUSED,
1769 Evas_Object *obj EINA_UNUSED,
1770 void *event_info EINA_UNUSED)
1772 Evas_Coord x, y, w, h,i;
1773 vg_progressbar *vd = data;
1774 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1775 for(i=0; i < 3; i++)
1777 evas_vg_shape_reset(vd->shape[i]);
1778 evas_vg_shape_stroke_color_set(vd->shape[i], 255, 255, 255, 255);
1779 evas_vg_shape_append_arc(vd->shape[i], 0, 0, w - vd->shrink, h - vd->shrink, 90.5, -1);
1780 evas_vg_shape_stroke_width_set(vd->shape[i], vd->stroke_width);
1781 evas_vg_node_origin_set(vd->shape[i], vd->shift, vd->shift);
1786 transit_progressbar_process_A_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1788 vg_progressbar *vd = effect;
1789 Evas_Coord x, y, w, h;
1790 double s_a = 90.5, e_a = 90.5, s_l = -1 , e_l = -126;
1791 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1792 double start_angle = s_a + (e_a - s_a) * progress;
1793 double sweep_length = s_l + (e_l - s_l) * progress;
1794 evas_vg_shape_reset(vd->shape[2]);
1795 evas_vg_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1799 transit_progressbar_process_A_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1801 vg_progressbar *vd = effect;
1802 Evas_Coord x, y, w, h;
1803 double s_a = 90.5, e_a = -170, s_l = -126 , e_l = -100;
1804 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1805 double start_angle = s_a + (e_a - s_a) * progress;
1806 double sweep_length = s_l + (e_l - s_l) * progress;
1807 evas_vg_shape_reset(vd->shape[2]);
1808 evas_vg_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1812 transit_progressbar_process_A_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1814 vg_progressbar *vd = effect;
1815 Evas_Coord x, y, w, h;
1816 double s_a = -170, e_a = -269.5, s_l = -100 , e_l = -1;
1817 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1818 double start_angle = s_a + (e_a - s_a) * progress;
1819 double sweep_length = s_l + (e_l - s_l) * progress;
1820 evas_vg_shape_reset(vd->shape[2]);
1821 evas_vg_shape_append_arc(vd->shape[2], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1825 transit_progressbar_process_B_op1(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1827 vg_progressbar *vd = effect;
1828 Evas_Coord x, y, w, h;
1829 double s_a = 90.5, e_a = 90.5, s_l = -1 , e_l = -172.8;
1830 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1831 double start_angle = s_a + (e_a - s_a) * progress;
1832 double sweep_length = s_l + (e_l - s_l) * progress;
1833 evas_vg_shape_reset(vd->shape[1]);
1834 evas_vg_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1838 transit_progressbar_process_B_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1840 vg_progressbar *vd = effect;
1841 Evas_Coord x, y, w, h;
1842 double s_a = 90.5, e_a = -129.7, s_l = -172.8 , e_l = -140.3;
1843 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1844 double start_angle = s_a + (e_a - s_a) * progress;
1845 double sweep_length = s_l + (e_l - s_l) * progress;
1846 evas_vg_shape_reset(vd->shape[1]);
1847 evas_vg_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1851 transit_progressbar_process_B_op3(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1853 vg_progressbar *vd = effect;
1854 Evas_Coord x, y, w, h;
1855 double s_a = -129.7, e_a = -269.5, s_l = -140.3 , e_l = -1;
1856 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1857 double start_angle = s_a + (e_a - s_a) * progress;
1858 double sweep_length = s_l + (e_l - s_l) * progress;
1859 evas_vg_shape_reset(vd->shape[1]);
1860 evas_vg_shape_append_arc(vd->shape[1], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1864 transit_progressbar_process_C_op1(Elm_Transit_Effect *effect EINA_UNUSED, Elm_Transit *transit EINA_UNUSED, double progress EINA_UNUSED)
1869 transit_progressbar_process_C_op2(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED, double progress)
1871 vg_progressbar *vd = effect;
1872 Evas_Coord x, y, w, h;
1873 double s_a = 89.5, e_a = -270.5, s_l = -1 , e_l = -1;
1874 evas_object_geometry_get(vd->vg[0], &x, &y, &w, &h);
1875 double start_angle = s_a + (e_a - s_a) * progress;
1876 double sweep_length = s_l + (e_l - s_l) * progress;
1877 evas_vg_shape_reset(vd->shape[0]);
1878 evas_vg_shape_append_arc(vd->shape[0], 0, 0, w - vd->shrink, h - vd->shrink, start_angle, sweep_length);
1881 static void _transit_progressbar_process_end(Elm_Transit_Effect *effect, Elm_Transit *transit);
1884 _progressbar_process_pulse_start_helper(void *data)
1886 vg_progressbar *vd = data;
1888 vd->pulse_job = NULL;
1890 // For Layer A animation
1891 elm_transit_del(vd->transit[0]);
1892 vd->transit[0] = elm_transit_add();
1893 elm_transit_effect_add(vd->transit[0], transit_progressbar_process_A_op1, vd, transit0_progress_del_cb);
1894 elm_transit_duration_set(vd->transit[0], 0.35);
1895 elm_transit_objects_final_state_keep_set(vd->transit[0], EINA_TRUE);
1897 elm_transit_del(vd->transit[1]);
1898 vd->transit[1] = elm_transit_add();
1899 elm_transit_effect_add(vd->transit[1], transit_progressbar_process_A_op2, vd, transit1_progress_del_cb);
1900 elm_transit_duration_set(vd->transit[1], 0.65);
1901 elm_transit_objects_final_state_keep_set(vd->transit[1], EINA_TRUE);
1903 elm_transit_del(vd->transit[2]);
1904 vd->transit[2] = elm_transit_add();
1905 elm_transit_effect_add(vd->transit[2], transit_progressbar_process_A_op3, vd, transit2_progress_del_cb);
1906 elm_transit_duration_set(vd->transit[2], 0.25);
1907 elm_transit_objects_final_state_keep_set(vd->transit[2], EINA_TRUE);
1909 elm_transit_chain_transit_add(vd->transit[0], vd->transit[1]);
1910 elm_transit_chain_transit_add(vd->transit[1], vd->transit[2]);
1912 elm_transit_go(vd->transit[0]);
1914 // For Layer B Animation
1915 elm_transit_del(vd->transit[3]);
1916 vd->transit[3] = elm_transit_add();
1917 elm_transit_effect_add(vd->transit[3], transit_progressbar_process_B_op1, vd, transit3_progress_del_cb);
1918 elm_transit_duration_set(vd->transit[3], 0.48);
1919 elm_transit_objects_final_state_keep_set(vd->transit[3], EINA_TRUE);
1921 elm_transit_del(vd->transit[4]);
1922 vd->transit[4] = elm_transit_add();
1923 elm_transit_effect_add(vd->transit[4], transit_progressbar_process_B_op2, vd, transit4_progress_del_cb);
1924 elm_transit_duration_set(vd->transit[4], 0.52);
1925 elm_transit_objects_final_state_keep_set(vd->transit[4], EINA_TRUE);
1927 elm_transit_del(vd->transit[5]);
1928 vd->transit[5] = elm_transit_add();
1929 elm_transit_effect_add(vd->transit[5], transit_progressbar_process_B_op3, vd, transit5_progress_del_cb);
1930 elm_transit_duration_set(vd->transit[5], 0.33);
1931 elm_transit_objects_final_state_keep_set(vd->transit[5], EINA_TRUE);
1933 elm_transit_chain_transit_add(vd->transit[3], vd->transit[4]);
1934 elm_transit_chain_transit_add(vd->transit[4], vd->transit[5]);
1936 elm_transit_go(vd->transit[3]);
1938 // This transition is just a dummy one
1939 // because transit_go_in dosen't guarentee the exact time transition will start.
1940 // this fixed the tail dot animation delay issue in 1st frame.
1941 elm_transit_del(vd->transit[6]);
1942 vd->transit[6] = elm_transit_add();
1943 elm_transit_effect_add(vd->transit[6], transit_progressbar_process_C_op1, vd, transit6_progress_del_cb);
1944 elm_transit_duration_set(vd->transit[6], .54);
1945 elm_transit_objects_final_state_keep_set(vd->transit[6], EINA_TRUE);
1946 elm_transit_go_in(vd->transit[6], .54);
1948 // For Layer C Animation
1949 elm_transit_del(vd->transit[7]);
1950 vd->transit[7] = elm_transit_add();
1951 elm_transit_effect_add(vd->transit[7], transit_progressbar_process_C_op2, vd, _transit_progressbar_process_end);
1952 elm_transit_duration_set(vd->transit[7], 0.85);
1953 elm_transit_objects_final_state_keep_set(vd->transit[7], EINA_TRUE);
1955 elm_transit_chain_transit_add(vd->transit[6], vd->transit[7]);
1957 elm_transit_go(vd->transit[6]);
1961 _transit_progressbar_process_end(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED)
1963 vg_progressbar *vd = effect;
1964 vd->transit[7] = NULL;
1966 // restart the pulse
1968 vd->pulse_job = ecore_job_add(_progressbar_process_pulse_start_helper, vd);
1972 _progressbar_process_pulse_start(void *data,
1973 Evas_Object *obj EINA_UNUSED,
1974 const char *emission EINA_UNUSED,
1975 const char *source EINA_UNUSED)
1977 vg_progressbar *vd = data;
1978 if (vd->pulse) return;
1980 vd->pulse = EINA_TRUE;
1981 _progressbar_process_pulse_start_helper(data);
1985 _progressbar_process_pulse_stop(void *data,
1986 Evas_Object *obj EINA_UNUSED,
1987 const char *emission EINA_UNUSED,
1988 const char *source EINA_UNUSED)
1994 progressbar_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
1995 void *event_info EINA_UNUSED)
1997 vg_progressbar *vd = evas_object_data_get(obj, vg_key);
2000 evas_object_data_set(obj, vg_key, NULL);
2001 elm_object_signal_callback_del(vd->obj, "elm,state,pulse,start",
2002 "*", _progressbar_process_pulse_start);
2003 elm_object_signal_callback_del(vd->obj, "elm,state,pulse,stop",
2004 "*", _progressbar_process_pulse_stop);
2005 evas_object_del(vd->vg[0]);
2006 evas_object_del(vd->vg[1]);
2007 evas_object_del(vd->vg[2]);
2012 _progressbar_process_style(vg_progressbar *vd)
2016 Evas *e = evas_object_evas_get(vd->obj);
2018 for(i=0; i < 3; i++)
2020 vd->vg[i] = evas_object_vg_add(e);
2021 root = evas_object_vg_root_node_get(vd->vg[i]);
2022 vd->shape[i] = evas_vg_shape_add(root);
2023 evas_vg_shape_stroke_color_set(vd->shape[i], 255, 255, 255, 255);
2024 evas_vg_shape_stroke_cap_set(vd->shape[i], EFL_GFX_CAP_ROUND);
2027 evas_object_event_callback_add(vd->vg[0], EVAS_CALLBACK_RESIZE,
2028 progressbar_process_resize_cb, vd);
2030 elm_object_part_content_set(vd->obj, "tizen_vg_shape1", vd->vg[0]);
2031 elm_object_part_content_set(vd->obj, "tizen_vg_shape2", vd->vg[1]);
2032 elm_object_part_content_set(vd->obj, "tizen_vg_shape3", vd->vg[2]);
2034 elm_object_signal_callback_add(vd->obj, "elm,state,pulse,start",
2035 "*", _progressbar_process_pulse_start, vd);
2037 elm_object_signal_callback_add(vd->obj, "elm,state,pulse,stop",
2038 "*", _progressbar_process_pulse_stop, vd);
2043 tizen_vg_progressbar_set(Elm_Progressbar *obj)
2045 vg_progressbar *vd = evas_object_data_get(obj, vg_key);
2048 if (vd->vg[0]) evas_object_del(vd->vg[0]);
2049 if (vd->vg[1]) evas_object_del(vd->vg[1]);
2050 if (vd->vg[2]) evas_object_del(vd->vg[2]);
2054 //Apply vector ux only theme has "vector_ux"
2055 const char *str = elm_layout_data_get(obj, "vector_ux");
2061 evas_object_data_set(vd->obj, vg_key, NULL);
2062 evas_object_event_callback_del(vd->obj, EVAS_CALLBACK_DEL,
2063 progressbar_del_cb);
2064 evas_object_event_callback_del(vd->obj, EVAS_CALLBACK_HIDE,
2065 progressbar_hide_cb);
2066 elm_object_signal_callback_del(vd->obj, "elm,state,pulse,start",
2067 "*", _progressbar_process_pulse_start);
2069 elm_object_signal_callback_del(vd->obj, "elm,state,pulse,stop",
2070 "*", _progressbar_process_pulse_stop);
2078 vd = calloc(1, sizeof(vg_progressbar));
2081 ERR("Failed to allocate vector graphics data memory");
2084 evas_object_data_set(obj, vg_key, vd);
2086 // callback to free vd data
2087 evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_DEL,
2088 progressbar_del_cb, NULL);
2089 evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_HIDE,
2090 progressbar_hide_cb, vd);
2093 if (!strcmp(str, "default"))
2095 _progressbar_normal_style(vd);
2098 if (!strcmp(str, "process_large") ||
2099 !strcmp(str, "process_medium") ||
2100 !strcmp(str, "process_small"))
2102 vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 5);
2103 if (!strcmp(str, "process_medium"))
2105 vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 3);
2107 if (!strcmp(str, "process_small"))
2109 vd->stroke_width = ELM_VG_SCALE_SIZE(vd->obj, 2);
2111 vd->shrink = 2 * vd->stroke_width;
2112 vd->shift = vd->stroke_width + 0.5;
2113 _progressbar_process_style(vd);
2118 /////////////////////////////////////////////////////////////////////////
2120 /////////////////////////////////////////////////////////////////////////
2122 typedef struct vg_slider_s
2125 Efl_VG_Shape *shape[7];
2128 Eina_Stringshare *style;
2131 static int slider_base = 0;
2132 static int slider_level = 1;
2133 static int slider_level2 = 2;
2134 static int slider_level_rest = 3;
2135 static int slider_center = 4;
2138 slider_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
2139 void *event_info EINA_UNUSED)
2141 vg_slider *vd = evas_object_data_get(obj, vg_key);
2144 evas_object_data_set(obj, vg_key, NULL);
2151 _append_circle(Efl_VG *shape, double cx, double cy, double r)
2153 evas_vg_shape_reset(shape);
2154 evas_vg_shape_append_circle(shape, cx, cy, r);
2159 _append_round_rect(Efl_VG *shape, int w, int h)
2161 double radius = w/2 > h/2 ? h/2 : w/2;
2162 evas_vg_shape_reset(shape);
2163 evas_vg_shape_append_rect(shape, 0, 0, w, h, radius, radius);
2167 slider_base_resize_cb(void *data , Evas *e EINA_UNUSED,
2168 Evas_Object *obj EINA_UNUSED,
2169 void *event_info EINA_UNUSED)
2172 vg_slider *vd = data;
2173 evas_object_geometry_get(vd->vg[slider_base], NULL, NULL, &w, &h);
2174 _append_round_rect(vd->shape[slider_base], w, h);
2178 slider_center_resize_cb(void *data , Evas *e EINA_UNUSED,
2179 Evas_Object *obj EINA_UNUSED,
2180 void *event_info EINA_UNUSED)
2183 vg_slider *vd = data;
2184 evas_object_geometry_get(vd->vg[slider_center], NULL, NULL, &w, &h);
2185 _append_round_rect(vd->shape[slider_center], w, h);
2189 slider_level_resize_cb(void *data , Evas *e EINA_UNUSED,
2190 Evas_Object *obj EINA_UNUSED,
2191 void *event_info EINA_UNUSED)
2194 vg_slider *vd = data;
2195 evas_object_geometry_get(vd->vg[slider_level], NULL, NULL, &w, &h);
2196 _append_round_rect(vd->shape[slider_level], w, h);
2200 slider_level2_resize_cb(void *data , Evas *e EINA_UNUSED,
2201 Evas_Object *obj EINA_UNUSED,
2202 void *event_info EINA_UNUSED)
2205 vg_slider *vd = data;
2206 evas_object_geometry_get(vd->vg[slider_level2], NULL, NULL, &w, &h);
2207 _append_round_rect(vd->shape[slider_level2], w, h);
2211 slider_level_rest_resize_cb(void *data , Evas *e EINA_UNUSED,
2212 Evas_Object *obj EINA_UNUSED,
2213 void *event_info EINA_UNUSED)
2216 vg_slider *vd = data;
2217 evas_object_geometry_get(vd->vg[slider_level_rest], NULL, NULL, &w, &h);
2218 _append_round_rect(vd->shape[slider_level_rest], w, h);
2221 //TIZEN_ONLY(20150915): slider: fix slider's handler bug
2223 slider_unfocused_cb(void *data EINA_UNUSED,
2225 void *event_info EINA_UNUSED)
2227 vg_slider *vd = evas_object_data_get(obj, vg_key);
2229 evas_object_hide(vd->popup);
2234 _slider_create_handle(vg_slider *vd)
2238 Evas *e = evas_object_evas_get(vd->obj);
2239 for(i=0; i < 5; i++)
2241 vd->vg[i] = evas_object_vg_add(e);
2242 root = evas_object_vg_root_node_get(vd->vg[i]);
2243 vd->shape[i] = evas_vg_shape_add(root);
2244 evas_vg_node_color_set(vd->shape[i], 255, 255, 255, 255);
2248 evas_object_event_callback_add(vd->vg[slider_base], EVAS_CALLBACK_RESIZE,
2249 slider_base_resize_cb, vd);
2250 elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape1", vd->vg[slider_base]);
2253 evas_object_event_callback_add(vd->vg[slider_level], EVAS_CALLBACK_RESIZE,
2254 slider_level_resize_cb, vd);
2255 elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape2", vd->vg[slider_level]);
2258 evas_object_event_callback_add(vd->vg[slider_level2], EVAS_CALLBACK_RESIZE,
2259 slider_level2_resize_cb, vd);
2260 elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape3", vd->vg[slider_level2]);
2262 // level rest only for warning type
2263 evas_object_event_callback_add(vd->vg[slider_level_rest], EVAS_CALLBACK_RESIZE,
2264 slider_level_rest_resize_cb, vd);
2265 elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape4", vd->vg[slider_level_rest]);
2268 evas_object_event_callback_add(vd->vg[slider_center], EVAS_CALLBACK_RESIZE,
2269 slider_center_resize_cb, vd);
2270 elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape5", vd->vg[slider_center]);
2274 tizen_vg_slider_set(Elm_Slider *obj, Evas_Object *popup)
2276 vg_slider *vd = evas_object_data_get(obj, vg_key);
2280 for(i=0; i < 7; i++)
2281 if (vd->vg[i]) evas_object_del(vd->vg[i]);
2282 eina_stringshare_del(vd->style);
2285 //Apply vector ux only theme has "vector_ux" "on"
2286 const char *str = elm_layout_data_get(obj, "vector_ux");
2291 vd = calloc(1, sizeof(vg_slider));
2294 ERR("Failed to allocate vector graphics data memory");
2297 evas_object_data_set(obj, vg_key, vd);
2300 // callback to free vd data
2301 evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_DEL,
2302 slider_del_cb, NULL);
2304 //TIZEN_ONLY(20150915): slider: fix slider's handler bug
2305 evas_object_smart_callback_add(vd->obj, SIG_LAYOUT_UNFOCUSED, slider_unfocused_cb, NULL);
2309 vd->style = eina_stringshare_add(str);
2311 _slider_create_handle(vd);