summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaehyun Cho <jae_hyun.cho@samsung.com>2017-09-04 19:17:48 +0900
committerJaehyun Cho <jae_hyun.cho@samsung.com>2017-09-18 20:49:31 +0900
commit1931ea7e5cc45ec85d0a6a3d7f50354c627c32ed (patch)
tree44137343dc92a6c0bf4cd5053ed9d5c0ab881b34
parent626551bd17d2918e361d02ce47e6fce3d85e26af (diff)
downloadefl-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.h3
-rw-r--r--src/lib/evas/canvas/efl_animation.c23
-rw-r--r--src/lib/evas/canvas/efl_animation.eo9
-rw-r--r--src/lib/evas/canvas/efl_animation_alpha.c3
-rw-r--r--src/lib/evas/canvas/efl_animation_group_parallel.c7
-rw-r--r--src/lib/evas/canvas/efl_animation_group_sequential.c7
-rw-r--r--src/lib/evas/canvas/efl_animation_instance.c75
-rw-r--r--src/lib/evas/canvas/efl_animation_instance_group_parallel.c17
-rw-r--r--src/lib/evas/canvas/efl_animation_instance_group_sequential.c23
-rw-r--r--src/lib/evas/canvas/efl_animation_instance_private.h3
-rw-r--r--src/lib/evas/canvas/efl_animation_private.h2
-rw-r--r--src/lib/evas/canvas/efl_animation_rotate.c3
-rw-r--r--src/lib/evas/canvas/efl_animation_scale.c3
-rw-r--r--src/lib/evas/canvas/efl_animation_translate.c3
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);