diff options
author | Jaehyun Cho <jae_hyun.cho@samsung.com> | 2017-09-04 19:17:48 +0900 |
---|---|---|
committer | Jaehyun Cho <jae_hyun.cho@samsung.com> | 2017-09-18 20:49:31 +0900 |
commit | 1931ea7e5cc45ec85d0a6a3d7f50354c627c32ed (patch) | |
tree | 44137343dc92a6c0bf4cd5053ed9d5c0ab881b34 | |
parent | 626551bd17d2918e361d02ce47e6fce3d85e26af (diff) | |
download | efl-1931ea7e5cc45ec85d0a6a3d7f50354c627c32ed.tar.gz |
efl_animation: Add start_delay property
Add start_delay property to delay the given amount of time in seconds
from when the animation starts until the animation is animated.
-rw-r--r-- | src/lib/evas/Evas_Internal.h | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation.c | 23 | ||||
-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 | 7 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_group_sequential.c | 7 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_instance.c | 75 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_instance_group_parallel.c | 17 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_instance_group_sequential.c | 23 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_instance_private.h | 3 | ||||
-rw-r--r-- | src/lib/evas/canvas/efl_animation_private.h | 2 | ||||
-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 |
14 files changed, 170 insertions, 11 deletions
diff --git a/src/lib/evas/Evas_Internal.h b/src/lib/evas/Evas_Internal.h index 3735aeb63f..d48c4ac9a6 100644 --- a/src/lib/evas/Evas_Internal.h +++ b/src/lib/evas/Evas_Internal.h @@ -87,6 +87,9 @@ EOAPI double efl_animation_instance_duration_get(const Eo *obj); EOAPI void efl_animation_instance_total_duration_set(Eo *obj, double total_duration); EOAPI double efl_animation_instance_total_duration_get(const Eo *obj); +EOAPI void efl_animation_instance_start_delay_set(Eo *obj, double delay_time); +EOAPI double efl_animation_instance_start_delay_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); diff --git a/src/lib/evas/canvas/efl_animation.c b/src/lib/evas/canvas/efl_animation.c index 74c391302e..b6a8b9f2ce 100644 --- a/src/lib/evas/canvas/efl_animation.c +++ b/src/lib/evas/canvas/efl_animation.c @@ -116,6 +116,27 @@ _efl_animation_repeat_count_get(Eo *eo_obj, Efl_Animation_Data *pd) return pd->repeat_count; } +EOLIAN static void +_efl_animation_start_delay_set(Eo *eo_obj, + Efl_Animation_Data *pd, + double delay_time) +{ + EFL_ANIMATION_CHECK_OR_RETURN(eo_obj); + + if (delay_time < 0.0) return; + + pd->start_delay_time = delay_time; +} + +EOLIAN static double +_efl_animation_start_delay_get(Eo *eo_obj, + Efl_Animation_Data *pd) +{ + EFL_ANIMATION_CHECK_OR_RETURN(eo_obj, 0.0); + + return pd->start_delay_time; +} + EOLIAN static Efl_Object * _efl_animation_efl_object_constructor(Eo *eo_obj, Efl_Animation_Data *pd) @@ -127,6 +148,8 @@ _efl_animation_efl_object_constructor(Eo *eo_obj, pd->duration = 0.0; pd->total_duration = 0.0; + pd->start_delay_time = 0.0; + pd->repeat_count = 0; pd->is_deleted = EINA_FALSE; diff --git a/src/lib/evas/canvas/efl_animation.eo b/src/lib/evas/canvas/efl_animation.eo index a32a13ab92..5243b0639e 100644 --- a/src/lib/evas/canvas/efl_animation.eo +++ b/src/lib/evas/canvas/efl_animation.eo @@ -50,6 +50,15 @@ abstract Efl.Animation (Efl.Object) count: int; [[Repeat count. EFL_ANIMATION_REPEAT_INFINITE repeats animation infinitely.]] } } + @property start_delay { + set { + } + get { + } + values { + delay_time: double; [[Delay time, in seconds, from when the animation starts until the animation is animated]] + } + } is_deleted @protected { return: bool; [[$true if animation is deleted, $false otherwise.]] } diff --git a/src/lib/evas/canvas/efl_animation_alpha.c b/src/lib/evas/canvas/efl_animation_alpha.c index 691650ec24..b8e91b4949 100644 --- a/src/lib/evas/canvas/efl_animation_alpha.c +++ b/src/lib/evas/canvas/efl_animation_alpha.c @@ -63,6 +63,9 @@ _efl_animation_alpha_efl_animation_instance_create(Eo *eo_obj, double total_duration = efl_animation_total_duration_get(eo_obj); efl_animation_instance_total_duration_set(instance, total_duration); + double start_delay_time = efl_animation_start_delay_get(eo_obj); + efl_animation_instance_start_delay_set(instance, start_delay_time); + int repeat_count = efl_animation_repeat_count_get(eo_obj); efl_animation_instance_repeat_count_set(instance, repeat_count); diff --git a/src/lib/evas/canvas/efl_animation_group_parallel.c b/src/lib/evas/canvas/efl_animation_group_parallel.c index 5a277f6a20..14bf3086b6 100644 --- a/src/lib/evas/canvas/efl_animation_group_parallel.c +++ b/src/lib/evas/canvas/efl_animation_group_parallel.c @@ -59,6 +59,10 @@ _efl_animation_group_parallel_efl_animation_total_duration_get(Eo *eo_obj, { double child_total_duration = efl_animation_total_duration_get(anim); + double start_delay = efl_animation_start_delay_get(anim); + if (start_delay > 0.0) + child_total_duration += start_delay; + int child_repeat_count = efl_animation_repeat_count_get(anim); if (child_repeat_count > 0) child_total_duration *= (child_repeat_count + 1); @@ -102,6 +106,9 @@ _efl_animation_group_parallel_efl_animation_instance_create(Eo *eo_obj, double total_duration = efl_animation_total_duration_get(eo_obj); efl_animation_instance_total_duration_set(group_inst, total_duration); + double start_delay_time = efl_animation_start_delay_get(eo_obj); + efl_animation_instance_start_delay_set(group_inst, start_delay_time); + int repeat_count = efl_animation_repeat_count_get(eo_obj); efl_animation_instance_repeat_count_set(group_inst, repeat_count); diff --git a/src/lib/evas/canvas/efl_animation_group_sequential.c b/src/lib/evas/canvas/efl_animation_group_sequential.c index 95f8b2d399..9becc66fc0 100644 --- a/src/lib/evas/canvas/efl_animation_group_sequential.c +++ b/src/lib/evas/canvas/efl_animation_group_sequential.c @@ -59,6 +59,10 @@ _efl_animation_group_sequential_efl_animation_total_duration_get(Eo *eo_obj, { double child_total_duration = efl_animation_total_duration_get(anim); + double start_delay = efl_animation_start_delay_get(anim); + if (start_delay > 0.0) + child_total_duration += start_delay; + int child_repeat_count = efl_animation_repeat_count_get(anim); if (child_repeat_count > 0) child_total_duration *= (child_repeat_count + 1); @@ -101,6 +105,9 @@ _efl_animation_group_sequential_efl_animation_instance_create(Eo *eo_obj, double total_duration = efl_animation_total_duration_get(eo_obj); efl_animation_instance_total_duration_set(group_inst, total_duration); + double start_delay_time = efl_animation_start_delay_get(eo_obj); + efl_animation_instance_start_delay_set(group_inst, start_delay_time); + int repeat_count = efl_animation_repeat_count_get(eo_obj); efl_animation_instance_repeat_count_set(group_inst, repeat_count); diff --git a/src/lib/evas/canvas/efl_animation_instance.c b/src/lib/evas/canvas/efl_animation_instance.c index 22fd462527..f74bced08b 100644 --- a/src/lib/evas/canvas/efl_animation_instance.c +++ b/src/lib/evas/canvas/efl_animation_instance.c @@ -96,6 +96,28 @@ _efl_animation_instance_repeat_count_get(const Eo *eo_obj, return pd->repeat_count; } +EOLIAN static void +_efl_animation_instance_start_delay_set(Eo *eo_obj, + Efl_Animation_Instance_Data *pd, + double delay_time) +{ + EFL_ANIMATION_INSTANCE_CHECK_OR_RETURN(eo_obj); + + if (delay_time < 0.0) return; + + pd->start_delay_time = delay_time; +} + +EOLIAN static double +_efl_animation_instance_start_delay_get(Eo *eo_obj, + Efl_Animation_Instance_Data *pd) +{ + EFL_ANIMATION_INSTANCE_CHECK_OR_RETURN(eo_obj, 0.0); + + return pd->start_delay_time; +} + + EOLIAN static Eina_Bool _efl_animation_instance_is_deleted(Eo *eo_obj, Efl_Animation_Instance_Data *pd) @@ -290,17 +312,14 @@ end: } static void -_start(Eo *eo_obj, Efl_Animation_Instance_Data *pd) +_init_start(Eo *eo_obj, Efl_Animation_Instance_Data *pd) { - if (pd->total_duration < 0.0) return; - //Save the current state of the target efl_animation_instance_target_state_save(eo_obj); pd->is_started = EINA_TRUE; pd->is_cancelled = EINA_FALSE; pd->is_ended = EINA_FALSE; - pd->is_paused = EINA_FALSE; pd->paused_time = 0.0; @@ -314,12 +333,39 @@ _start(Eo *eo_obj, Efl_Animation_Instance_Data *pd) //pre start event is supported within class only (protected event) efl_event_callback_call(eo_obj, EFL_ANIMATION_INSTANCE_EVENT_PRE_START, NULL); efl_event_callback_call(eo_obj, EFL_ANIMATION_INSTANCE_EVENT_START, NULL); +} + +static void +_start(Eo *eo_obj, Efl_Animation_Instance_Data *pd) +{ + if (pd->total_duration < 0.0) return; + + _init_start(eo_obj, pd); pd->animator = ecore_animator_add(_animator_cb, eo_obj); _animator_cb(eo_obj); } +static Eina_Bool +_start_delay_timer_cb(void *data) +{ + Eo *eo_obj = data; + EFL_ANIMATION_INSTANCE_DATA_GET(eo_obj, pd); + + pd->start_delay_timer = NULL; + + if (pd->is_paused) + { + pd->time.pause_begin = ecore_loop_time_get(); + _init_start(eo_obj, pd); + } + else + _start(eo_obj, pd); + + return ECORE_CALLBACK_CANCEL; +} + EOLIAN static void _efl_animation_instance_start(Eo *eo_obj, Efl_Animation_Instance_Data *pd) @@ -328,6 +374,15 @@ _efl_animation_instance_start(Eo *eo_obj, if (pd->is_paused) return; + if (pd->start_delay_timer) return; + + if (pd->start_delay_time > 0.0) + { + pd->start_delay_timer = ecore_timer_add(pd->start_delay_time, + _start_delay_timer_cb, eo_obj); + return; + } + _start(eo_obj, pd); } @@ -337,6 +392,9 @@ _efl_animation_instance_cancel(Eo *eo_obj, { EFL_ANIMATION_INSTANCE_CHECK_OR_RETURN(eo_obj); + ecore_timer_del(pd->start_delay_timer); + pd->start_delay_timer = NULL; + pd->is_cancelled = EINA_TRUE; pd->is_ended = EINA_TRUE; @@ -365,6 +423,8 @@ _efl_animation_instance_pause(Eo *eo_obj, pd->is_paused = EINA_TRUE; + if (pd->start_delay_timer) return; + ecore_animator_del(pd->animator); pd->animator = NULL; @@ -383,6 +443,8 @@ _efl_animation_instance_resume(Eo *eo_obj, pd->is_paused = EINA_FALSE; + if (pd->start_delay_timer) return; + pd->paused_time += (ecore_loop_time_get() - pd->time.pause_begin); pd->animator = ecore_animator_add(_animator_cb, eo_obj); @@ -457,6 +519,9 @@ EOAPI EFL_FUNC_BODY_CONST(efl_animation_instance_duration_get, double, 0); EOAPI EFL_VOID_FUNC_BODYV(efl_animation_instance_total_duration_set, EFL_FUNC_CALL(total_duration), double total_duration); EOAPI EFL_FUNC_BODY_CONST(efl_animation_instance_total_duration_get, double, 0); +EOAPI EFL_VOID_FUNC_BODYV(efl_animation_instance_start_delay_set, EFL_FUNC_CALL(delay_time), double delay_time); +EOAPI EFL_FUNC_BODY_CONST(efl_animation_instance_start_delay_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); @@ -469,6 +534,8 @@ EOAPI EFL_FUNC_BODY_CONST(efl_animation_instance_repeat_count_get, int, 0); EFL_OBJECT_OP_FUNC(efl_animation_instance_duration_get, _efl_animation_instance_duration_get), \ EFL_OBJECT_OP_FUNC(efl_animation_instance_total_duration_set, _efl_animation_instance_total_duration_set), \ EFL_OBJECT_OP_FUNC(efl_animation_instance_total_duration_get, _efl_animation_instance_total_duration_get), \ + EFL_OBJECT_OP_FUNC(efl_animation_instance_start_delay_set, _efl_animation_instance_start_delay_set), \ + EFL_OBJECT_OP_FUNC(efl_animation_instance_start_delay_get, _efl_animation_instance_start_delay_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) 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 aff58c9246..7e565e8d0c 100644 --- a/src/lib/evas/canvas/efl_animation_instance_group_parallel.c +++ b/src/lib/evas/canvas/efl_animation_instance_group_parallel.c @@ -124,6 +124,10 @@ _efl_animation_instance_group_parallel_efl_animation_instance_total_duration_get double child_total_duration = efl_animation_instance_total_duration_get(inst); + double start_delay = efl_animation_instance_start_delay_get(inst); + if (start_delay > 0.0) + child_total_duration += start_delay; + int child_repeat_count = efl_animation_instance_repeat_count_get(inst); if (child_repeat_count > 0) child_total_duration *= (child_repeat_count + 1); @@ -178,18 +182,27 @@ _efl_animation_instance_group_parallel_efl_animation_instance_progress_set(Eo *e EINA_LIST_FOREACH(instances, l, inst) { double total_duration = efl_animation_instance_total_duration_get(inst); + double start_delay = efl_animation_instance_start_delay_get(inst); double inst_progress; if (total_duration == 0.0) inst_progress = 1.0; else { + double elapsed_time_without_delay; + //If instance is repeated, then recalculate progress. int repeated_count = _repeated_count_get(pd, inst); if (repeated_count > 0) - inst_progress = (elapsed_time - (total_duration * repeated_count)) / total_duration; + elapsed_time_without_delay = + (elapsed_time - ((total_duration + start_delay) * repeated_count)) - start_delay; else - inst_progress = elapsed_time / total_duration; + elapsed_time_without_delay = elapsed_time - start_delay; + + //Instance should not start to wait for start delay time. + if (elapsed_time_without_delay < 0.0) continue; + + inst_progress = elapsed_time_without_delay / total_duration; if (inst_progress > 1.0) inst_progress = 1.0; 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 c8e0f70c51..2d42a90bcb 100644 --- a/src/lib/evas/canvas/efl_animation_instance_group_sequential.c +++ b/src/lib/evas/canvas/efl_animation_instance_group_sequential.c @@ -124,6 +124,10 @@ _efl_animation_instance_group_sequential_efl_animation_instance_total_duration_g double child_total_duration = efl_animation_instance_total_duration_get(inst); + double start_delay = efl_animation_instance_start_delay_get(inst); + if (start_delay > 0.0) + child_total_duration += start_delay; + int child_repeat_count = efl_animation_instance_repeat_count_get(inst); if (child_repeat_count > 0) child_total_duration *= (child_repeat_count + 1); @@ -182,6 +186,7 @@ _efl_animation_instance_group_sequential_efl_animation_instance_progress_set(Eo //Sum the current total duration double total_duration = efl_animation_instance_total_duration_get(inst); + double start_delay = efl_animation_instance_start_delay_get(inst); double inst_progress; @@ -192,10 +197,17 @@ _efl_animation_instance_group_sequential_efl_animation_instance_progress_set(Eo //If instance is repeated, then recalculate progress. int repeated_count = _repeated_count_get(pd, inst); if (repeated_count > 0) - sum_prev_total_duration += (total_duration * repeated_count); + sum_prev_total_duration += + ((total_duration + start_delay) * repeated_count); + + double elapsed_time_without_delay = + elapsed_time - sum_prev_total_duration - start_delay; + + //Instance should not start to wait for start delay time. + if (elapsed_time_without_delay < 0.0) break; + + inst_progress = elapsed_time_without_delay / total_duration; - inst_progress = - (elapsed_time - sum_prev_total_duration) / total_duration; if (inst_progress > 1.0) inst_progress = 1.0; @@ -218,8 +230,9 @@ _efl_animation_instance_group_sequential_efl_animation_instance_progress_set(Eo } } - //Update the sum of the previous instances' total durations - sum_prev_total_duration += total_duration; + /* Update the sum of the previous instances' total durations and start + * delays */ + sum_prev_total_duration += (total_duration + start_delay); if ((inst_progress == 1.0) && !efl_animation_instance_final_state_keep_get(inst)) diff --git a/src/lib/evas/canvas/efl_animation_instance_private.h b/src/lib/evas/canvas/efl_animation_instance_private.h index 3827eb4671..f896d014c6 100644 --- a/src/lib/evas/canvas/efl_animation_instance_private.h +++ b/src/lib/evas/canvas/efl_animation_instance_private.h @@ -19,6 +19,9 @@ typedef struct _Efl_Animation_Instance_Data { Ecore_Animator *animator; + Ecore_Timer *start_delay_timer; + double start_delay_time; + struct { double begin; diff --git a/src/lib/evas/canvas/efl_animation_private.h b/src/lib/evas/canvas/efl_animation_private.h index 49e635c22a..6c993f4bd3 100644 --- a/src/lib/evas/canvas/efl_animation_private.h +++ b/src/lib/evas/canvas/efl_animation_private.h @@ -12,6 +12,8 @@ typedef struct _Efl_Animation_Data double duration; double total_duration; + double start_delay_time; + int repeat_count; Eina_Bool is_deleted : 1; diff --git a/src/lib/evas/canvas/efl_animation_rotate.c b/src/lib/evas/canvas/efl_animation_rotate.c index 32efce2317..4540e88081 100644 --- a/src/lib/evas/canvas/efl_animation_rotate.c +++ b/src/lib/evas/canvas/efl_animation_rotate.c @@ -211,6 +211,9 @@ _efl_animation_rotate_efl_animation_instance_create(Eo *eo_obj, double total_duration = efl_animation_total_duration_get(eo_obj); efl_animation_instance_total_duration_set(instance, total_duration); + double start_delay_time = efl_animation_start_delay_get(eo_obj); + efl_animation_instance_start_delay_set(instance, start_delay_time); + int repeat_count = efl_animation_repeat_count_get(eo_obj); efl_animation_instance_repeat_count_set(instance, repeat_count); diff --git a/src/lib/evas/canvas/efl_animation_scale.c b/src/lib/evas/canvas/efl_animation_scale.c index 172c894e8e..d97117b274 100644 --- a/src/lib/evas/canvas/efl_animation_scale.c +++ b/src/lib/evas/canvas/efl_animation_scale.c @@ -237,6 +237,9 @@ _efl_animation_scale_efl_animation_instance_create(Eo *eo_obj, double total_duration = efl_animation_total_duration_get(eo_obj); efl_animation_instance_total_duration_set(instance, total_duration); + double start_delay_time = efl_animation_start_delay_get(eo_obj); + efl_animation_instance_start_delay_set(instance, start_delay_time); + int repeat_count = efl_animation_repeat_count_get(eo_obj); efl_animation_instance_repeat_count_set(instance, repeat_count); diff --git a/src/lib/evas/canvas/efl_animation_translate.c b/src/lib/evas/canvas/efl_animation_translate.c index 8a29a4b687..a9ccbf006e 100644 --- a/src/lib/evas/canvas/efl_animation_translate.c +++ b/src/lib/evas/canvas/efl_animation_translate.c @@ -179,6 +179,9 @@ _efl_animation_translate_efl_animation_instance_create(Eo *eo_obj, double total_duration = efl_animation_total_duration_get(eo_obj); efl_animation_instance_total_duration_set(instance, total_duration); + double start_delay_time = efl_animation_start_delay_get(eo_obj); + efl_animation_instance_start_delay_set(instance, start_delay_time); + int repeat_count = efl_animation_repeat_count_get(eo_obj); efl_animation_instance_repeat_count_set(instance, repeat_count); |