diff options
author | Jaehyun Cho <jae_hyun.cho@samsung.com> | 2017-06-02 15:31:26 +0900 |
---|---|---|
committer | Jaehyun Cho <jae_hyun.cho@samsung.com> | 2017-06-02 16:50:42 +0900 |
commit | b2bb0ba61034516856b5f570f41b75a6b8de2c6c (patch) | |
tree | de0ec5c5b18585cd7e92581be4d2231e4d2623f9 | |
parent | 4b27138f5e8e95dd23a7a26fdbc5f346d6391196 (diff) | |
download | efl-devs/jaehyun/animation2.tar.gz |
efl_animation: Remove instance functions from animation classesdevs/jaehyun/animation2
-rw-r--r-- | src/lib/evas/canvas/efl_animation.eo | 5 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_alpha.c | 22 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_alpha.eo | 1 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_group_sequential.c | 34 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_group_sequential.eo | 1 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_rotate.c | 33 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_rotate.eo | 1 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_scale.c | 29 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_scale.eo | 1 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_translate.c | 38 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_translate.eo | 1 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_object_main.c | 127 |
12 files changed, 241 insertions, 52 deletions
diff --git a/src/lib/evas/canvas/efl_animation.eo b/src/lib/evas/canvas/efl_animation.eo index 87c87f6dd2..1c8e9f2463 100644 --- a/src/lib/evas/canvas/efl_animation.eo +++ b/src/lib/evas/canvas/efl_animation.eo @@ -41,10 +41,15 @@ abstract Efl.Animation (Efl.Object) [[Duplicate animation]] return: Efl.Animation; [[Duplicated animation]] } + instance_create { + [[Create instance of the animation.]] + return: Efl.Animation.Instance; [[Created instance of the animation]] + } } implements { Efl.Object.constructor; Efl.Object.destructor; @empty .dup; + @empty .instance_create; } } diff --git a/src/lib/evas/canvas/efl_animation_alpha.c b/src/lib/evas/canvas/efl_animation_alpha.c index 1a9a97ab79..c282c054f1 100644 --- a/src/lib/evas/canvas/efl_animation_alpha.c +++ b/src/lib/evas/canvas/efl_animation_alpha.c @@ -76,6 +76,28 @@ _efl_animation_alpha_efl_animation_dup(Eo *eo_obj, Evas_Object_Animation_Alpha_D return animation; } +EOLIAN static Efl_Animation_Instance * +_efl_animation_alpha_efl_animation_instance_create(Eo *eo_obj, Evas_Object_Animation_Alpha_Data *pd) +{ + EFL_ANIMATION_ALPHA_CHECK_OR_RETURN(eo_obj, NULL); + + Efl_Animation_Instance_Alpha *instance + = efl_add(EFL_ANIMATION_INSTANCE_ALPHA_CLASS, NULL); + + Eo *target = efl_animation_target_get(eo_obj); + efl_animation_instance_target_set(instance, target); + + Eina_Bool state_keep = efl_animation_final_state_keep_get(eo_obj); + efl_animation_instance_final_state_keep_set(instance, state_keep); + + double duration = efl_animation_duration_get(eo_obj); + efl_animation_instance_duration_set(instance, duration); + + efl_animation_instance_alpha_set(instance, pd->from.alpha, pd->to.alpha); + + return instance; +} + EOLIAN static Efl_Object * _efl_animation_alpha_efl_object_constructor(Eo *eo_obj, Evas_Object_Animation_Alpha_Data *pd) { diff --git a/src/lib/evas/canvas/efl_animation_alpha.eo b/src/lib/evas/canvas/efl_animation_alpha.eo index 235cb7c7e7..faf360395a 100644 --- a/src/lib/evas/canvas/efl_animation_alpha.eo +++ b/src/lib/evas/canvas/efl_animation_alpha.eo @@ -21,5 +21,6 @@ class Efl.Animation.Alpha (Efl.Animation) Efl.Object.constructor; Efl.Object.destructor; Efl.Animation.dup; + Efl.Animation.instance_create; } } diff --git a/src/lib/evas/canvas/efl_animation_group_sequential.c b/src/lib/evas/canvas/efl_animation_group_sequential.c index a07ab3ea9d..f78f300b06 100644 --- a/src/lib/evas/canvas/efl_animation_group_sequential.c +++ b/src/lib/evas/canvas/efl_animation_group_sequential.c @@ -52,4 +52,38 @@ _efl_animation_group_sequential_efl_animation_dup(Eo *eo_obj, Evas_Object_Animat return animation; } +EOLIAN static Efl_Animation_Instance * +_efl_animation_group_sequential_efl_animation_instance_create(Eo *eo_obj, Evas_Object_Animation_Group_Sequential_Data *pd) +{ + EFL_ANIMATION_GROUP_SEQUENTIAL_CHECK_OR_RETURN(eo_obj, NULL); + + Efl_Animation_Instance_Group_Sequential *instance + = efl_add(EFL_ANIMATION_INSTANCE_GROUP_SEQUENTIAL_CLASS, NULL); + + Eo *target = efl_animation_target_get(eo_obj); + efl_animation_instance_target_set(instance, target); + + Eina_Bool state_keep = efl_animation_final_state_keep_get(eo_obj); + efl_animation_instance_final_state_keep_set(instance, state_keep); + + double duration = efl_animation_duration_get(eo_obj); + efl_animation_instance_duration_set(instance, duration); + + Efl_Animation_Instance_Group_Sequential *group_inst + = efl_add(EFL_ANIMATION_INSTANCE_GROUP_SEQUENTIAL_CLASS, NULL); + + Eina_List *animations = efl_animation_group_animations_get(eo_obj); + Eina_List *l; + Efl_Animation *child_anim; + Efl_Animation_Instance *child_inst; + + EINA_LIST_FOREACH(animations, l, child_anim) + { + child_inst = efl_animation_instance_create(child_anim); + efl_animation_instance_group_instance_add(group_inst, child_inst); + } + + return group_inst; +} + #include "efl_animation_group_sequential.eo.c" diff --git a/src/lib/evas/canvas/efl_animation_group_sequential.eo b/src/lib/evas/canvas/efl_animation_group_sequential.eo index e961eb72ce..f609b083bb 100644 --- a/src/lib/evas/canvas/efl_animation_group_sequential.eo +++ b/src/lib/evas/canvas/efl_animation_group_sequential.eo @@ -9,5 +9,6 @@ class Efl.Animation.Group.Sequential (Efl.Animation.Group) } implements { Efl.Animation.dup; + Efl.Animation.instance_create; } } diff --git a/src/lib/evas/canvas/efl_animation_rotate.c b/src/lib/evas/canvas/efl_animation_rotate.c index b73ff91243..c9ffe524bd 100644 --- a/src/lib/evas/canvas/efl_animation_rotate.c +++ b/src/lib/evas/canvas/efl_animation_rotate.c @@ -156,6 +156,39 @@ _efl_animation_rotate_efl_animation_dup(Eo *eo_obj, Evas_Object_Animation_Rotate return animation; } +EOLIAN static Efl_Animation_Instance * +_efl_animation_rotate_efl_animation_instance_create(Eo *eo_obj, Evas_Object_Animation_Rotate_Data *pd) +{ + EFL_ANIMATION_ROTATE_CHECK_OR_RETURN(eo_obj, NULL); + + Efl_Animation_Instance_Rotate *instance + = efl_add(EFL_ANIMATION_INSTANCE_ROTATE_CLASS, NULL); + + Eo *target = efl_animation_target_get(eo_obj); + efl_animation_instance_target_set(instance, target); + + Eina_Bool state_keep = efl_animation_final_state_keep_get(eo_obj); + efl_animation_instance_final_state_keep_set(instance, state_keep); + + double duration = efl_animation_duration_get(eo_obj); + efl_animation_instance_duration_set(instance, duration); + + efl_animation_instance_rotate_angle_set(instance, + pd->from.angle, pd->to.angle); + + efl_animation_instance_rotate_relative_pivot_set(instance, + pd->rel_pivot.x, + pd->rel_pivot.y, + pd->rel_pivot.z); + + efl_animation_instance_rotate_absolute_pivot_set(instance, + pd->abs_pivot.x, + pd->abs_pivot.y, + pd->abs_pivot.z); + + return instance; +} + EOLIAN static Efl_Object * _efl_animation_rotate_efl_object_constructor(Eo *eo_obj, Evas_Object_Animation_Rotate_Data *pd) { diff --git a/src/lib/evas/canvas/efl_animation_rotate.eo b/src/lib/evas/canvas/efl_animation_rotate.eo index 05408e5059..50b9a6227b 100644 --- a/src/lib/evas/canvas/efl_animation_rotate.eo +++ b/src/lib/evas/canvas/efl_animation_rotate.eo @@ -43,5 +43,6 @@ class Efl.Animation.Rotate (Efl.Animation) Efl.Object.constructor; Efl.Object.destructor; Efl.Animation.dup; + Efl.Animation.instance_create; } } diff --git a/src/lib/evas/canvas/efl_animation_scale.c b/src/lib/evas/canvas/efl_animation_scale.c index dc097f20b1..f625a8aa7f 100644 --- a/src/lib/evas/canvas/efl_animation_scale.c +++ b/src/lib/evas/canvas/efl_animation_scale.c @@ -153,6 +153,35 @@ _efl_animation_scale_efl_animation_dup(Eo *eo_obj, Evas_Object_Animation_Scale_D return animation; } +EOLIAN static Efl_Animation_Instance * +_efl_animation_scale_efl_animation_instance_create(Eo *eo_obj, Evas_Object_Animation_Scale_Data *pd) +{ + EFL_ANIMATION_SCALE_CHECK_OR_RETURN(eo_obj, NULL); + + Efl_Animation_Instance_Scale *instance + = efl_add(EFL_ANIMATION_INSTANCE_SCALE_CLASS, NULL); + + Eo *target = efl_animation_target_get(eo_obj); + efl_animation_instance_target_set(instance, target); + + Eina_Bool state_keep = efl_animation_final_state_keep_get(eo_obj); + efl_animation_instance_final_state_keep_set(instance, state_keep); + + double duration = efl_animation_duration_get(eo_obj); + efl_animation_instance_duration_set(instance, duration); + + efl_animation_instance_scale_x_set(instance, + pd->from.scale_x, pd->to.scale_x); + + efl_animation_instance_scale_y_set(instance, + pd->from.scale_y, pd->from.scale_y); + + efl_animation_instance_scale_z_set(instance, + pd->from.scale_z, pd->to.scale_z); + + return instance; +} + EOLIAN static Efl_Object * _efl_animation_scale_efl_object_constructor(Eo *eo_obj, Evas_Object_Animation_Scale_Data *pd) { diff --git a/src/lib/evas/canvas/efl_animation_scale.eo b/src/lib/evas/canvas/efl_animation_scale.eo index 79e44eb307..5b6b594f56 100644 --- a/src/lib/evas/canvas/efl_animation_scale.eo +++ b/src/lib/evas/canvas/efl_animation_scale.eo @@ -51,5 +51,6 @@ class Efl.Animation.Scale (Efl.Animation) Efl.Object.constructor; Efl.Object.destructor; Efl.Animation.dup; + Efl.Animation.instance_create; } } diff --git a/src/lib/evas/canvas/efl_animation_translate.c b/src/lib/evas/canvas/efl_animation_translate.c index aa0138501b..b7b1ee87ef 100644 --- a/src/lib/evas/canvas/efl_animation_translate.c +++ b/src/lib/evas/canvas/efl_animation_translate.c @@ -270,6 +270,44 @@ _efl_animation_translate_efl_animation_dup(Eo *eo_obj, Evas_Object_Animation_Tra return animation; } +EOLIAN static Efl_Animation_Instance * +_efl_animation_translate_efl_animation_instance_create(Eo *eo_obj, Evas_Object_Animation_Translate_Data *pd) +{ + EFL_ANIMATION_TRANSLATE_CHECK_OR_RETURN(eo_obj, NULL); + + Efl_Animation_Instance_Translate *instance + = efl_add(EFL_ANIMATION_INSTANCE_TRANSLATE_CLASS, NULL); + + Eo *target = efl_animation_target_get(eo_obj); + efl_animation_instance_target_set(instance, target); + + Eina_Bool state_keep = efl_animation_final_state_keep_get(eo_obj); + efl_animation_instance_final_state_keep_set(instance, state_keep); + + double duration = efl_animation_duration_get(eo_obj); + efl_animation_instance_duration_set(instance, duration); + + efl_animation_instance_translate_x_set(instance, + pd->from.move_x, pd->to.move_x); + + efl_animation_instance_translate_y_set(instance, + pd->from.move_y, pd->to.move_y); + + efl_animation_instance_translate_z_set(instance, + pd->from.move_z, pd->to.move_z); + + efl_animation_instance_translate_coordinate_x_set(instance, + pd->from.x, pd->to.x); + + efl_animation_instance_translate_coordinate_y_set(instance, + pd->from.y, pd->to.y); + + efl_animation_instance_translate_coordinate_z_set(instance, + pd->from.z, pd->to.z); + + return instance; +} + EOLIAN static Efl_Object * _efl_animation_translate_efl_object_constructor(Eo *eo_obj, Evas_Object_Animation_Translate_Data *pd) { diff --git a/src/lib/evas/canvas/efl_animation_translate.eo b/src/lib/evas/canvas/efl_animation_translate.eo index 85d4bf799a..4f371697c4 100644 --- a/src/lib/evas/canvas/efl_animation_translate.eo +++ b/src/lib/evas/canvas/efl_animation_translate.eo @@ -99,5 +99,6 @@ class Efl.Animation.Translate (Efl.Animation) Efl.Object.constructor; Efl.Object.destructor; Efl.Animation.dup; + Efl.Animation.instance_create; } } diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index de68f9b340..2586a8acd9 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -44,11 +44,13 @@ Eina_Cow *evas_object_mask_cow = NULL; typedef struct _Event_Animation { - Efl_Animation *anim; + Efl_Animation *anim; + Efl_Animation_Instance *inst; } Event_Animation; typedef struct _Hide_Anim_Data { + Eo *target; Eina_Bool anim_started; Eina_Bool anim_ended; } Hide_Anim_Data; @@ -1042,17 +1044,44 @@ _efl_animation_event_type_get(const char *event_str) return -1; } +static Eina_Bool +_efl_animation_event_type_is_valid(Efl_Animation_Event_Type event) +{ + if ((event < 0) || (event >= EFL_ANIMATION_EVENT_TYPE_COUNT)) + return EINA_FALSE; + + return EINA_TRUE; +} + +static Efl_Animation_Instance * +_event_animation_instance_get(Eo *eo_obj, + Efl_Animation_Event_Type event_type) +{ + Evas_Object_Protected_Data *pd = efl_data_scope_get(eo_obj, MY_CLASS); + if (!pd) return NULL; + + if (!_efl_animation_event_type_is_valid(event_type)) + return NULL; + + Event_Animation *event_anim = eina_array_data_get(pd->event_anims, + event_type); + if (event_anim && event_anim->inst) + return event_anim->inst; + + return NULL; +} + static void -_all_animations_cancel(Eo *eo_obj) +_all_animation_instances_cancel(Eo *eo_obj) { Efl_Animation_Event_Type event_type; for (event_type = EFL_ANIMATION_EVENT_TYPE_SHOW; event_type < EFL_ANIMATION_EVENT_TYPE_COUNT; event_type++) { - Efl_Animation *anim = efl_canvas_object_event_animation_get(eo_obj, - event_type); - if (anim) - efl_animation_cancel(anim); + Efl_Animation_Instance *inst = _event_animation_instance_get(eo_obj, + event_type); + if (inst) + efl_animation_instance_cancel(inst); } } @@ -1071,12 +1100,12 @@ _efl_canvas_object_efl_object_event_callback_call(Eo *eo_obj, if (!_efl_animation_event_type_is_inform_call(event_type)) { - Efl_Animation *anim = - efl_canvas_object_event_animation_get(eo_obj, event_type); - if (anim) + Efl_Animation_Instance *inst = + _event_animation_instance_get(eo_obj, event_type); + if (inst) { - _all_animations_cancel(eo_obj); - efl_animation_start(anim); + _all_animation_instances_cancel(eo_obj); + efl_animation_instance_start(inst); } } } @@ -1100,12 +1129,12 @@ _efl_canvas_object_efl_object_event_callback_legacy_call(Eo *eo_obj, if (!_efl_animation_event_type_is_inform_call(event_type)) { - Efl_Animation *anim = - efl_canvas_object_event_animation_get(eo_obj, event_type); - if (anim) + Efl_Animation_Instance *inst = + _event_animation_instance_get(eo_obj, event_type); + if (inst) { - _all_animations_cancel(eo_obj); - efl_animation_start(anim); + _all_animation_instances_cancel(eo_obj); + efl_animation_instance_start(inst); } } } @@ -1777,8 +1806,7 @@ _animation_hide_end_cb(void *data, const Efl_Event *event) hide_anim_data->anim_ended = EINA_TRUE; - Eo *eo_obj = efl_animation_target_get(event->object); - _animation_intercept_hide(hide_anim_data, eo_obj); + _animation_intercept_hide(hide_anim_data, hide_anim_data->target); hide_anim_data->anim_started = EINA_FALSE; hide_anim_data->anim_ended = EINA_FALSE; @@ -1789,15 +1817,14 @@ _animation_intercept_hide(void *data, Evas_Object *eo_obj) { Hide_Anim_Data *hide_anim_data = data; - Efl_Animation *anim = - efl_canvas_object_event_animation_get(eo_obj, - EFL_ANIMATION_EVENT_TYPE_HIDE); - if (anim && !hide_anim_data->anim_started && !hide_anim_data->anim_ended) + Efl_Animation_Instance *inst = + _event_animation_instance_get(eo_obj, EFL_ANIMATION_EVENT_TYPE_HIDE); + if (inst && !hide_anim_data->anim_started && !hide_anim_data->anim_ended) { hide_anim_data->anim_started = EINA_TRUE; - _all_animations_cancel(eo_obj); - efl_animation_start(anim); + _all_animation_instances_cancel(eo_obj); + efl_animation_instance_start(inst); } else efl_gfx_visible_set(eo_obj, EINA_FALSE); @@ -1845,13 +1872,12 @@ _show(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_update_bounding_box(eo_obj, obj, NULL); evas_object_inform_call_show(eo_obj); - Efl_Animation *anim = - efl_canvas_object_event_animation_get(eo_obj, - EFL_ANIMATION_EVENT_TYPE_SHOW); - if (anim) + Efl_Animation_Instance *inst = + _event_animation_instance_get(eo_obj, EFL_ANIMATION_EVENT_TYPE_SHOW); + if (inst) { - _all_animations_cancel(eo_obj); - efl_animation_start(anim); + _all_animation_instances_cancel(eo_obj); + efl_animation_instance_start(inst); } } @@ -2746,26 +2772,17 @@ EOAPI EFL_VOID_FUNC_BODYV(efl_canvas_object_type_set, EFL_FUNC_CALL(type), const EFL_OBJECT_OP_FUNC(efl_canvas_object_legacy_ctor, _efl_canvas_object_legacy_ctor), \ EFL_OBJECT_OP_FUNC(efl_canvas_object_type_set, _efl_canvas_object_type_set) -static Eina_Bool -_efl_animation_event_type_is_valid(Efl_Animation_Event_Type event) -{ - if ((event < 0) || (event >= EFL_ANIMATION_EVENT_TYPE_COUNT)) - return EINA_FALSE; - - return EINA_TRUE; -} - static void _anim_del_cb(void *data, const Efl_Event *event) { Eo *eo_obj = data; - Efl_Animation *anim = event->object; + Efl_Animation_Instance *inst = event->object; Efl_Animation_Event_Type event_type; for (event_type = EFL_ANIMATION_EVENT_TYPE_SHOW; event_type < EFL_ANIMATION_EVENT_TYPE_COUNT; event_type++) { - if (anim == efl_canvas_object_event_animation_get(eo_obj, event_type)) + if (inst == _event_animation_instance_get(eo_obj, event_type)) efl_canvas_object_event_animation_set(eo_obj, event_type, NULL); } } @@ -2783,14 +2800,12 @@ _efl_canvas_object_event_animation_set(Eo *eo_obj, if (!event_anim) return; Efl_Animation *cur_anim = event_anim->anim; - Efl_Animation *new_anim = NULL; - if (animation) new_anim = efl_animation_dup(animation); + Efl_Animation_Instance *cur_inst = event_anim->inst; //Unset for current event animation if (cur_anim) { - Eo *prev_target = - efl_animation_target_get(cur_anim); + Eo *prev_target = efl_animation_target_get(cur_anim); //Deallocate memory and Unset callbacks for Hide event if (event_type == EFL_ANIMATION_EVENT_TYPE_HIDE) @@ -2800,7 +2815,8 @@ _efl_canvas_object_event_animation_set(Eo *eo_obj, _animation_intercept_hide); if (hide_anim_data) { - efl_event_callback_del(cur_anim, EFL_ANIMATION_EVENT_END, + efl_event_callback_del(cur_inst, + EFL_ANIMATION_INSTANCE_EVENT_END, _animation_hide_end_cb, hide_anim_data); @@ -2813,15 +2829,15 @@ _efl_canvas_object_event_animation_set(Eo *eo_obj, } //Unset callback - efl_event_callback_del(cur_anim, EFL_EVENT_DEL, + efl_event_callback_del(cur_inst, EFL_EVENT_DEL, _anim_del_cb, prev_target); //Stop animation - efl_animation_cancel(cur_anim); + efl_animation_instance_cancel(cur_inst); } - //Replace current event animation with new event animation - event_anim->anim = new_anim; + Efl_Animation *new_anim = animation; + Efl_Animation_Instance *new_inst = NULL; //Set for new event animation if (new_anim) @@ -2836,6 +2852,7 @@ _efl_canvas_object_event_animation_set(Eo *eo_obj, if (event_type == EFL_ANIMATION_EVENT_TYPE_HIDE) { Hide_Anim_Data *hide_anim_data = calloc(1, sizeof(Hide_Anim_Data)); + hide_anim_data->target = target; hide_anim_data->anim_started = EINA_FALSE; hide_anim_data->anim_ended = EINA_FALSE; @@ -2843,14 +2860,20 @@ _efl_canvas_object_event_animation_set(Eo *eo_obj, _animation_intercept_hide, hide_anim_data); - efl_event_callback_add(new_anim, EFL_ANIMATION_EVENT_END, + new_inst = efl_animation_instance_create(new_anim); + + efl_event_callback_add(new_inst, EFL_ANIMATION_INSTANCE_EVENT_END, _animation_hide_end_cb, hide_anim_data); } //Set callback - efl_event_callback_add(new_anim, EFL_EVENT_DEL, _anim_del_cb, target); + efl_event_callback_add(new_inst, EFL_EVENT_DEL, _anim_del_cb, target); } + + //Replace current event animation with new event animation + event_anim->anim = new_anim; + event_anim->inst = new_inst; } EOLIAN Efl_Animation * |