diff options
author | Jaehyun Cho <jae_hyun.cho@samsung.com> | 2017-07-11 21:01:37 +0900 |
---|---|---|
committer | Jaehyun Cho <jae_hyun.cho@samsung.com> | 2017-08-18 12:06:01 +0900 |
commit | 50c0c101deeedda05c91f0c19084c2b64ad48a6a (patch) | |
tree | d4911634dfc9c61de060f57dc8182ef9be72b64d | |
parent | 0edfa0b06ac8d3197831205e90be1a445b3601d6 (diff) | |
download | efl-50c0c101deeedda05c91f0c19084c2b64ad48a6a.tar.gz |
efl_animation: Add repeat_count property
Use animator when member instance is started as an animation repetition
in group parallel instance in the same way of group sequential instance.
-rw-r--r-- | src/lib/evas/Evas_Internal.h | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation.c | 25 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation.eo | 9 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_alpha.c | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_group_parallel.c | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_group_sequential.c | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_instance.c | 58 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_instance_group_parallel.c | 57 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_instance_group_sequential.c | 25 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_rotate.c | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_scale.c | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_translate.c | 3 |
12 files changed, 195 insertions, 0 deletions
diff --git a/src/lib/evas/Evas_Internal.h b/src/lib/evas/Evas_Internal.h index 7c23f50745..984bc27e76 100644 --- a/src/lib/evas/Evas_Internal.h +++ b/src/lib/evas/Evas_Internal.h @@ -93,6 +93,9 @@ EOAPI Eina_Bool efl_animation_instance_final_state_keep_get(const Eo *obj); EOAPI void efl_animation_instance_duration_set(Eo *obj, double duration); EOAPI double efl_animation_instance_duration_get(const Eo *obj); +EOAPI void efl_animation_instance_repeat_count_set(Eo *obj, int count); +EOAPI int efl_animation_instance_repeat_count_get(const Eo *obj); + EOAPI Eina_Bool efl_animation_instance_is_deleted(Eo *obj); EOAPI void efl_animation_instance_member_start(Eo *obj); diff --git a/src/lib/evas/canvas/efl_animation.c b/src/lib/evas/canvas/efl_animation.c index 24a63499c2..1446c47980 100644 --- a/src/lib/evas/canvas/efl_animation.c +++ b/src/lib/evas/canvas/efl_animation.c @@ -34,6 +34,8 @@ struct _Evas_Object_Animation_Data double duration; + int repeat_count; + Eina_Bool deleted : 1; Eina_Bool state_keep : 1; }; @@ -91,6 +93,27 @@ _efl_animation_duration_get(Eo *eo_obj, Evas_Object_Animation_Data *pd) return pd->duration; } +EOLIAN static void +_efl_animation_repeat_count_set(Eo *eo_obj, + Evas_Object_Animation_Data *pd, + int count) +{ + EFL_ANIMATION_CHECK_OR_RETURN(eo_obj); + + //-1 repeats animation infinitely + if ((count < 0) && (count != -1)) return; + + pd->repeat_count = count; +} + +EOLIAN static int +_efl_animation_repeat_count_get(Eo *eo_obj, Evas_Object_Animation_Data *pd) +{ + EFL_ANIMATION_CHECK_OR_RETURN(eo_obj, 0); + + return pd->repeat_count; +} + EOLIAN static Eina_Bool _efl_animation_is_deleted(Eo *eo_obj, Evas_Object_Animation_Data *pd) { @@ -129,6 +152,8 @@ _efl_animation_efl_object_constructor(Eo *eo_obj, pd->duration = 0.0; + pd->repeat_count = 0; + pd->deleted = EINA_FALSE; pd->state_keep = EINA_FALSE; diff --git a/src/lib/evas/canvas/efl_animation.eo b/src/lib/evas/canvas/efl_animation.eo index 8f5aad686c..084fd7a7b0 100644 --- a/src/lib/evas/canvas/efl_animation.eo +++ b/src/lib/evas/canvas/efl_animation.eo @@ -33,6 +33,15 @@ abstract Efl.Animation (Efl.Object) duration: double; [[Duration value]] } } + @property repeat_count { + set { + } + get { + } + values { + count: int; [[Repeat count. -1 repeats animation infinitely.]] + } + } instance_create { [[Create instance of the animation.]] return: Efl.Animation.Instance; [[Created instance of the animation]] diff --git a/src/lib/evas/canvas/efl_animation_alpha.c b/src/lib/evas/canvas/efl_animation_alpha.c index 6d3c165b91..8be3485122 100644 --- a/src/lib/evas/canvas/efl_animation_alpha.c +++ b/src/lib/evas/canvas/efl_animation_alpha.c @@ -67,6 +67,9 @@ _efl_animation_alpha_efl_animation_instance_create(Eo *eo_obj, Evas_Object_Anima double duration = efl_animation_duration_get(eo_obj); efl_animation_instance_duration_set(instance, duration); + int repeat_count = efl_animation_repeat_count_get(eo_obj); + efl_animation_instance_repeat_count_set(instance, repeat_count); + efl_animation_instance_alpha_set(instance, pd->from.alpha, pd->to.alpha); return instance; diff --git a/src/lib/evas/canvas/efl_animation_group_parallel.c b/src/lib/evas/canvas/efl_animation_group_parallel.c index f5a86319e9..a92e08b046 100644 --- a/src/lib/evas/canvas/efl_animation_group_parallel.c +++ b/src/lib/evas/canvas/efl_animation_group_parallel.c @@ -51,6 +51,9 @@ _efl_animation_group_parallel_efl_animation_instance_create(Eo *eo_obj, if (duration > 0.0) efl_animation_instance_duration_set(group_inst, duration); + int repeat_count = efl_animation_repeat_count_get(eo_obj); + efl_animation_instance_repeat_count_set(group_inst, repeat_count); + Eina_Bool state_keep = efl_animation_final_state_keep_get(eo_obj); efl_animation_instance_final_state_keep_set(group_inst, state_keep); diff --git a/src/lib/evas/canvas/efl_animation_group_sequential.c b/src/lib/evas/canvas/efl_animation_group_sequential.c index 6aaf18273f..b24410f7d2 100644 --- a/src/lib/evas/canvas/efl_animation_group_sequential.c +++ b/src/lib/evas/canvas/efl_animation_group_sequential.c @@ -51,6 +51,9 @@ _efl_animation_group_sequential_efl_animation_instance_create(Eo *eo_obj, if (duration > 0.0) efl_animation_instance_duration_set(group_inst, duration); + int repeat_count = efl_animation_repeat_count_get(eo_obj); + efl_animation_instance_repeat_count_set(group_inst, repeat_count); + Eina_Bool state_keep = efl_animation_final_state_keep_get(eo_obj); efl_animation_instance_final_state_keep_set(group_inst, state_keep); diff --git a/src/lib/evas/canvas/efl_animation_instance.c b/src/lib/evas/canvas/efl_animation_instance.c index 38e4fcf074..fb4e937d60 100644 --- a/src/lib/evas/canvas/efl_animation_instance.c +++ b/src/lib/evas/canvas/efl_animation_instance.c @@ -53,6 +53,9 @@ struct _Evas_Object_Animation_Instance_Data double duration; double paused_time; + int repeat_count; + int remaining_repeat_count; + Eina_Bool deleted : 1; Eina_Bool started : 1; Eina_Bool cancelled : 1; @@ -118,6 +121,29 @@ _efl_animation_instance_duration_get(const Eo *eo_obj, return pd->duration; } +EOLIAN static void +_efl_animation_instance_repeat_count_set(Eo *eo_obj, + Evas_Object_Animation_Instance_Data *pd, + int count) +{ + EFL_ANIMATION_INSTANCE_CHECK_OR_RETURN(eo_obj); + + //-1 repeats animation infinitely + if ((count < 0) && (count != -1)) return; + + pd->repeat_count = count; +} + +EOLIAN static int +_efl_animation_instance_repeat_count_get(const Eo *eo_obj, + Evas_Object_Animation_Instance_Data *pd) +{ + EFL_ANIMATION_INSTANCE_CHECK_OR_RETURN((Eo *)eo_obj, 0); + + return pd->repeat_count; +} + + EOLIAN static Eina_Bool _efl_animation_instance_is_deleted(Eo *eo_obj, Evas_Object_Animation_Instance_Data *pd) @@ -235,6 +261,29 @@ _animator_cb(void *data) if ((elapsed_time - paused_time) < duration) return ECORE_CALLBACK_RENEW; end: + if (pd->repeat_count > 0) + { + pd->remaining_repeat_count--; + if (pd->remaining_repeat_count >= 0) + { + pd->time.begin = ecore_loop_time_get(); + pd->paused_time = 0.0; + + _target_state_restore(pd->target, pd->target_state); + + return ECORE_CALLBACK_RENEW; + } + } + else if (pd->repeat_count == -1) + { + pd->time.begin = ecore_loop_time_get(); + pd->paused_time = 0.0; + + _target_state_restore(pd->target, pd->target_state); + + return ECORE_CALLBACK_RENEW; + } + pd->ended = EINA_TRUE; pd->animator = NULL; @@ -269,6 +318,8 @@ _start(Eo *eo_obj, Evas_Object_Animation_Instance_Data *pd) pd->paused_time = 0.0; + pd->remaining_repeat_count = pd->repeat_count; + ecore_animator_del(pd->animator); pd->animator = NULL; @@ -404,6 +455,8 @@ _efl_animation_instance_efl_object_constructor(Eo *eo_obj, pd->progress = 0.0; pd->duration = 0.0; + pd->repeat_count = 0; + pd->deleted = EINA_FALSE; pd->cancelled = EINA_FALSE; pd->ended = EINA_FALSE; @@ -453,6 +506,9 @@ EOAPI EFL_FUNC_BODY_CONST(efl_animation_instance_final_state_keep_get, Eina_Bool EOAPI EFL_VOID_FUNC_BODYV(efl_animation_instance_duration_set, EFL_FUNC_CALL(duration), double duration); EOAPI EFL_FUNC_BODY_CONST(efl_animation_instance_duration_get, double, 0); +EOAPI EFL_VOID_FUNC_BODYV(efl_animation_instance_repeat_count_set, EFL_FUNC_CALL(count), int count); +EOAPI EFL_FUNC_BODY_CONST(efl_animation_instance_repeat_count_get, int, 0); + EOAPI EFL_FUNC_BODY(efl_animation_instance_is_deleted, Eina_Bool, 0); EOAPI EFL_VOID_FUNC_BODY(efl_animation_instance_member_start); @@ -475,6 +531,8 @@ EWAPI const Efl_Event_Description _EFL_ANIMATION_INSTANCE_EVENT_POST_END = EFL_OBJECT_OP_FUNC(efl_animation_instance_final_state_keep_get, _efl_animation_instance_final_state_keep_get), \ EFL_OBJECT_OP_FUNC(efl_animation_instance_duration_set, _efl_animation_instance_duration_set), \ EFL_OBJECT_OP_FUNC(efl_animation_instance_duration_get, _efl_animation_instance_duration_get), \ + EFL_OBJECT_OP_FUNC(efl_animation_instance_repeat_count_set, _efl_animation_instance_repeat_count_set), \ + EFL_OBJECT_OP_FUNC(efl_animation_instance_repeat_count_get, _efl_animation_instance_repeat_count_get), \ EFL_OBJECT_OP_FUNC(efl_animation_instance_is_deleted, _efl_animation_instance_is_deleted), \ EFL_OBJECT_OP_FUNC(efl_animation_instance_member_start, _efl_animation_instance_member_start), \ EFL_OBJECT_OP_FUNC(efl_animation_instance_map_reset, _efl_animation_instance_map_reset), \ diff --git a/src/lib/evas/canvas/efl_animation_instance_group_parallel.c b/src/lib/evas/canvas/efl_animation_instance_group_parallel.c index c0093e10b7..c380ab61cd 100644 --- a/src/lib/evas/canvas/efl_animation_instance_group_parallel.c +++ b/src/lib/evas/canvas/efl_animation_instance_group_parallel.c @@ -1,5 +1,6 @@ #include "evas_common_private.h" #include "evas_private.h" +#include <Ecore.h> #define MY_CLASS EFL_ANIMATION_INSTANCE_GROUP_PARALLEL_CLASS #define MY_CLASS_NAME efl_class_name_get(MY_CLASS) @@ -21,8 +22,11 @@ struct _Evas_Object_Animation_Instance_Group_Parallel_Data { + Ecore_Animator *start_animator; + int animate_inst_count; int animate_inst_index; + int remaining_repeat_count; Eina_List *finished_inst_list; @@ -77,6 +81,30 @@ _pre_animate_cb(void *data, const Efl_Event *event) pd->animate_inst_index = 0; } +static Eina_Bool +_start_animator_cb(void *data) +{ + Eo *eo_obj = data; + + EFL_ANIMATION_INSTANCE_GROUP_PARALLEL_DATA_GET(eo_obj, pd); + + Eina_List *instances = + efl_animation_instance_group_instances_get(eo_obj); + Eina_List *l; + Efl_Animation *inst; + + EINA_LIST_FOREACH(instances, l, inst) + { + //Data should be registered before animation instance starts + efl_animation_instance_member_start(inst); + pd->animate_inst_count++; + } + + pd->start_animator = NULL; + + return ECORE_CALLBACK_CANCEL; +} + static void _post_end_cb(void *data, const Efl_Event *event) { @@ -100,6 +128,30 @@ _post_end_cb(void *data, const Efl_Event *event) if (pd->animate_inst_count == 0) { + int repeat_count = efl_animation_instance_repeat_count_get(eo_obj); + if (repeat_count > 0) + { + pd->remaining_repeat_count--; + if (pd->remaining_repeat_count >= 0) + { + eina_list_free(pd->finished_inst_list); + pd->finished_inst_list = NULL; + + pd->start_animator = ecore_animator_add(_start_animator_cb, + eo_obj); + return; + } + } + else if (repeat_count == -1) + { + eina_list_free(pd->finished_inst_list); + pd->finished_inst_list = NULL; + + pd->start_animator = ecore_animator_add(_start_animator_cb, + eo_obj); + return; + } + efl_event_callback_call(eo_obj, EFL_ANIMATION_INSTANCE_EVENT_END, NULL); //post end event is supported within class only (protected event) efl_event_callback_call(eo_obj, EFL_ANIMATION_INSTANCE_EVENT_POST_END, @@ -130,11 +182,16 @@ _member_post_end_cb(void *data, const Efl_Event *event) static void _start(Eo *eo_obj, Evas_Object_Animation_Instance_Group_Parallel_Data *pd) { + ecore_animator_del(pd->start_animator); + pd->start_animator = NULL; + pd->animate_inst_count = 0; pd->animate_inst_index = 0; pd->started = EINA_TRUE; + pd->remaining_repeat_count = efl_animation_instance_repeat_count_get(eo_obj); + efl_event_callback_call(eo_obj, EFL_ANIMATION_INSTANCE_EVENT_START, NULL); Eina_List *instances = efl_animation_instance_group_instances_get(eo_obj); diff --git a/src/lib/evas/canvas/efl_animation_instance_group_sequential.c b/src/lib/evas/canvas/efl_animation_instance_group_sequential.c index d90fe718dc..39bbf8af64 100644 --- a/src/lib/evas/canvas/efl_animation_instance_group_sequential.c +++ b/src/lib/evas/canvas/efl_animation_instance_group_sequential.c @@ -26,6 +26,8 @@ struct _Evas_Object_Animation_Instance_Group_Sequential_Data unsigned int current_index; + int remaining_repeat_count; + Eina_List *finished_inst_list; Eina_Bool started : 1; @@ -103,6 +105,26 @@ _post_end_cb(void *data, const Efl_Event *event) { pd->current_index = 0; + int repeat_count = efl_animation_instance_repeat_count_get(eo_obj); + if (repeat_count > 0) + { + pd->remaining_repeat_count--; + if (pd->remaining_repeat_count >= 0) + { + eina_list_free(pd->finished_inst_list); + pd->finished_inst_list = NULL; + + goto next_start; + } + } + else if (repeat_count == -1) + { + eina_list_free(pd->finished_inst_list); + pd->finished_inst_list = NULL; + + goto next_start; + } + efl_event_callback_call(eo_obj, EFL_ANIMATION_INSTANCE_EVENT_END, NULL); //post end event is supported within class only (protected event) efl_event_callback_call(eo_obj, EFL_ANIMATION_INSTANCE_EVENT_POST_END, @@ -110,6 +132,7 @@ _post_end_cb(void *data, const Efl_Event *event) return; } +next_start: pd->start_animator = ecore_animator_add(_start_animator_cb, eo_obj); } @@ -154,6 +177,8 @@ _start(Eo *eo_obj, Evas_Object_Animation_Instance_Group_Sequential_Data *pd) pd->started = EINA_TRUE; + pd->remaining_repeat_count = efl_animation_instance_repeat_count_get(eo_obj); + efl_event_callback_call(eo_obj, EFL_ANIMATION_INSTANCE_EVENT_START, NULL); _index_animation_start(eo_obj, pd->current_index); diff --git a/src/lib/evas/canvas/efl_animation_rotate.c b/src/lib/evas/canvas/efl_animation_rotate.c index 15d5480b05..3296c10f7c 100644 --- a/src/lib/evas/canvas/efl_animation_rotate.c +++ b/src/lib/evas/canvas/efl_animation_rotate.c @@ -238,6 +238,9 @@ _efl_animation_rotate_efl_animation_instance_create(Eo *eo_obj, double duration = efl_animation_duration_get(eo_obj); efl_animation_instance_duration_set(instance, duration); + int repeat_count = efl_animation_repeat_count_get(eo_obj); + efl_animation_instance_repeat_count_set(instance, repeat_count); + if (pd->use_rel_pivot) { efl_animation_instance_rotate_set(instance, diff --git a/src/lib/evas/canvas/efl_animation_scale.c b/src/lib/evas/canvas/efl_animation_scale.c index dce4ddc868..cec1eb4fab 100644 --- a/src/lib/evas/canvas/efl_animation_scale.c +++ b/src/lib/evas/canvas/efl_animation_scale.c @@ -264,6 +264,9 @@ _efl_animation_scale_efl_animation_instance_create(Eo *eo_obj, double duration = efl_animation_duration_get(eo_obj); efl_animation_instance_duration_set(instance, duration); + int repeat_count = efl_animation_repeat_count_get(eo_obj); + efl_animation_instance_repeat_count_set(instance, repeat_count); + if (pd->use_rel_pivot) { efl_animation_instance_scale_set(instance, diff --git a/src/lib/evas/canvas/efl_animation_translate.c b/src/lib/evas/canvas/efl_animation_translate.c index fe0e48ff83..661e710e5c 100644 --- a/src/lib/evas/canvas/efl_animation_translate.c +++ b/src/lib/evas/canvas/efl_animation_translate.c @@ -193,6 +193,9 @@ _efl_animation_translate_efl_animation_instance_create(Eo *eo_obj, double duration = efl_animation_duration_get(eo_obj); efl_animation_instance_duration_set(instance, duration); + int repeat_count = efl_animation_repeat_count_get(eo_obj); + efl_animation_instance_repeat_count_set(instance, repeat_count); + if (pd->use_rel_move) { efl_animation_instance_translate_set(instance, |