ecore: animator use eo_add() instead of eo_add_custom()

Summary:
- use defauld constructor instead of custom one.
- we don't allow construction of an animator with a NULL callback function,
  this is checked in overriden eo_finalize.
- we don't support changing this callback once the object is created,
  such calls will call ERR() and return.

see 46a78e8c and f92e5d50 for eo_add_custom() -> eo_add() details

Reviewers: tasn

Reviewed By: tasn

CC: cedric

Differential Revision: https://phab.enlightenment.org/D1113
This commit is contained in:
Jérémy Zurcher 2014-07-03 22:33:15 +02:00
parent 1ede3cc69f
commit ec4ffb86d6
3 changed files with 104 additions and 53 deletions

View File

@ -154,42 +154,35 @@ _do_tick(void)
return ECORE_CALLBACK_RENEW;
}
static Eina_Bool
_ecore_animator_add(Ecore_Animator *obj,
Ecore_Animator_Data *animator,
Ecore_Task_Cb func,
const void *data)
EOLIAN static Eo *
_ecore_animator_eo_base_finalize(Eo *obj, Ecore_Animator_Data *animator)
{
if (EINA_UNLIKELY(!eina_main_loop_is()))
{
eo_error_set(obj);
EINA_MAIN_LOOP_CHECK_RETURN_VAL(EINA_FALSE);
}
animator->obj = obj;
eo_do_super(obj, MY_CLASS, eo_constructor());
eo_manual_free_set(obj, EINA_TRUE);
if (!func)
if (!animator->func)
{
eo_error_set(obj);
ERR("callback function must be set up for an object of class: '%s'", MY_CLASS_NAME);
return EINA_FALSE;
goto finalize;
}
animator->func = func;
animator->data = (void *)data;
if (EINA_UNLIKELY(!eina_main_loop_is()))
{
eo_error_set(obj);
EINA_MAIN_LOOP_CHECK_RETURN_VAL(
eo_do_super(obj, MY_CLASS, eo_finalize()));
goto finalize;
}
_ecore_lock();
eo_manual_free_set(obj, EINA_TRUE);
animator->just_added = EINA_TRUE;
animators = (Ecore_Animator_Data *)eina_inlist_append(EINA_INLIST_GET(animators), EINA_INLIST_GET(animator));
_begin_tick();
return EINA_TRUE;
}
EOLIAN static void
_ecore_animator_eo_base_constructor(Eo *obj, Ecore_Animator_Data *_pd EINA_UNUSED)
{
eo_error_set(obj);
ERR("only custom constructor can be used with '%s' class", MY_CLASS_NAME);
_begin_tick();
_ecore_unlock();
finalize:
return eo_do_super(obj, MY_CLASS, eo_finalize());
}
EAPI Ecore_Animator *
@ -198,17 +191,27 @@ ecore_animator_add(Ecore_Task_Cb func,
{
Ecore_Animator *animator = NULL;
animator = eo_add_custom(MY_CLASS, _ecore_parent,
ecore_animator_constructor(func, data));
animator = eo_add(MY_CLASS, _ecore_parent,
ecore_obj_animator_init(func, data));
eo_unref(animator);
return animator;
}
EOLIAN static void
_ecore_animator_constructor(Eo *obj, Ecore_Animator_Data *animator, Ecore_Task_Cb func, const void *data)
_ecore_animator_init(Eo *obj, Ecore_Animator_Data *animator, Ecore_Task_Cb func, const void *data)
{
if (animator->func != NULL)
{
ERR("do not call this function out of '%s' object construction", MY_CLASS_NAME);
return;
}
_ecore_lock();
_ecore_animator_add(obj, animator, func, data);
animator->obj = obj;
animator->func = func;
animator->data = (void *)data;
_ecore_unlock();
}
@ -218,27 +221,32 @@ ecore_animator_timeline_add(double runtime,
const void *data)
{
Ecore_Animator *animator;
animator = eo_add_custom(MY_CLASS, _ecore_parent,
ecore_animator_timeline_constructor(runtime, func, data));
animator = eo_add(MY_CLASS, _ecore_parent,
ecore_obj_animator_timeline_init(runtime, func, data));
eo_unref(animator);
return animator;
}
EOLIAN static void
_ecore_animator_timeline_constructor(Eo *obj, Ecore_Animator_Data *animator, double runtime, Ecore_Timeline_Cb func, const void *data)
_ecore_animator_timeline_init(Eo *obj, Ecore_Animator_Data *animator, double runtime, Ecore_Timeline_Cb func, const void *data)
{
if (animator->func != NULL)
{
ERR("do not call this function out of '%s' object construction", MY_CLASS_NAME);
return;
}
if (runtime < 0.0) runtime = 0.0;
_ecore_lock();
if (runtime <= 0.0) runtime = 0.0;
if (!_ecore_animator_add(obj, animator, _ecore_animator_run, NULL)) goto unlock;
animator->obj = obj;
animator->func = _ecore_animator_run;
animator->data = obj;
animator->run_func = func;
animator->run_data = (void *)data;
animator->start = ecore_loop_time_get();
animator->run = runtime;
unlock:
_ecore_unlock();
}
@ -687,4 +695,4 @@ _ecore_animator(void *data EINA_UNUSED)
return r;
}
#include "ecore_animator.eo.c"
#include "ecore_animator.eo.c"

View File

@ -1,25 +1,65 @@
class Ecore.Animator (Eo.Base)
{
eo_prefix: ecore_animator;
constructors {
timeline_constructor {
/*@ Contructor. */
legacy_prefix: null;
eo_prefix: ecore_obj_animator;
methods {
init {
/*@
Set the @p func to be called at every animation tick during main loop execution.
The function @p func will be called every N seconds where N is
the @p frametime interval set by ecore_animator_frametime_set(). The
function will be passed the @p data pointer as its parameter.
When the animator @p func is called, it must return a boolean value.
If it returns EINA_TRUE (or ECORE_CALLBACK_RENEW), it will be called again at
the next tick, or if it returns EINA_FALSE (or ECORE_CALLBACK_CANCEL) it will be
deleted automatically making any references/handles for it invalid.
@note Do NOT call this method outside of object constructor.
@note The default @p frametime value is 1/30th of a second.
@see ecore_obj_animator_timeline_set()
@see ecore_animator_frametime_set() */
params {
@in double runtime;
@in Ecore_Timeline_Cb func;
@in const(void)* data;
@in Ecore_Task_Cb func; /*@ The function to call when it ticks off */
@in const(void)* data; /*@ The data to pass to the function */
}
}
constructor {
/*@ Contructor. */
timeline_init {
/*@
Set the @p func to be called at every animation tick during main loop execution, that runs for a limited time
This function is just like ecore_obj_animator_task_set() except the animator only
runs for a limited time specified in seconds by @p runtime. Once the
runtime the animator has elapsed (animator finished) it will automatically
be deleted. The callback function @p func can return ECORE_CALLBACK_RENEW
to keep the animator running or ECORE_CALLBACK_CANCEL ro stop it and have
it be deleted automatically at any time.
The @p func will ALSO be passed a position parameter that will be in value
from 0.0 to 1.0 to indicate where along the timeline (0.0 start, 1.0 end)
the animator run is at. If the callback wishes not to have a linear
transition it can "map" this value to one of several curves and mappings
via ecore_animator_pos_map().
@note Do NOT call this method outside of object constructor.
@note The default @p frametime value is 1/30th of a second.
@see ecore_obj_animator_task_set()
@see ecore_animator_pos_map()
@since 1.1.0 */
params {
@in Ecore_Task_Cb func;
@in const(void)* data;
@in double runtime; /*@ The time to run in seconds */
@in Ecore_Timeline_Cb func; /*@ The function to call when it ticks off */
@in const(void)* data; /*@ The data to pass to the function */
}
}
}
implements {
Eo.Base.constructor;
Eo.Base.finalize;
Eo.Base.destructor;
Eo.Base.event_freeze;
Eo.Base.event_thaw;

View File

@ -29,15 +29,18 @@ START_TEST(ecore_test_animators)
fail_if(!ecore_init(), "ERROR: Cannot init Ecore!\n");
ecore_animator_frametime_set(interval1);
animator = eo_add_custom(ECORE_ANIMATOR_CLASS, NULL, ecore_animator_timeline_constructor(1, _anim_cb, &interval1));
animator = eo_add(ECORE_ANIMATOR_CLASS, NULL);
fail_if(animator);
animator = eo_add(ECORE_ANIMATOR_CLASS, NULL, ecore_obj_animator_timeline_init(1, _anim_cb, &interval1));
fail_if(!animator);
ecore_main_loop_begin();
ecore_animator_frametime_set(interval2);
prev = 0;
animator = eo_add_custom(ECORE_ANIMATOR_CLASS, NULL, ecore_animator_timeline_constructor(1, _anim_cb, &interval2));
animator = eo_add(ECORE_ANIMATOR_CLASS, NULL, ecore_obj_animator_timeline_init(1, _anim_cb, &interval2));
fail_if(!animator);
ecore_main_loop_begin();