summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaehyun Cho <jae_hyun.cho@samsung.com>2017-07-11 21:01:37 +0900
committerJaehyun Cho <jae_hyun.cho@samsung.com>2017-08-18 12:06:01 +0900
commit50c0c101deeedda05c91f0c19084c2b64ad48a6a (patch)
treed4911634dfc9c61de060f57dc8182ef9be72b64d
parent0edfa0b06ac8d3197831205e90be1a445b3601d6 (diff)
downloadefl-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.h3
-rw-r--r--src/lib/evas/canvas/efl_animation.c25
-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.c3
-rw-r--r--src/lib/evas/canvas/efl_animation_group_sequential.c3
-rw-r--r--src/lib/evas/canvas/efl_animation_instance.c58
-rw-r--r--src/lib/evas/canvas/efl_animation_instance_group_parallel.c57
-rw-r--r--src/lib/evas/canvas/efl_animation_instance_group_sequential.c25
-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
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,