#include <Elementary.h>
#include "elm_priv.h"
+#define ELM_ANIMATOR_CHECK_OR_RETURN(animator, ...) \
+ do { \
+ if (!animator) { \
+ CRITICAL("Elm_Animator " # animator " is NULL!"); \
+ return __VA_ARGS__; \
+ } \
+ if (!EINA_MAGIC_CHECK(animator, ELM_ANIMATOR_MAGIC)) { \
+ EINA_MAGIC_FAIL(animator, ELM_ANIMATOR_MAGIC); \
+ return __VA_ARGS__; \
+ } \
+ } while (0)
+
+
/**
* @addtogroup Animator Animator
* @ingroup Elementary
*
- * Support normalized frame value for animation.
-*/
-#define MAGIC_OBJ_ANIMATOR 0x40777770
+ * elm_animator is designed to provides animation frame.
+ * It is somewhat different with any others widgets however elm_animator
+ * might useful when your GUIs have animation.
+ * Basically, it computes normalized frame value for animation,
+ * provides additional functions to adjust this also.
+ *
+ */
struct _Elm_Animator
{
- int magic;
+#define ELM_ANIMATOR_MAGIC 0x40777770
+ EINA_MAGIC;
+
Evas_Object *parent;
Ecore_Animator *animator;
double begin_time;
//Not end. Keep going.
if (elapsed_time < animator->duration) return ECORE_CALLBACK_RENEW;
- //Repeat and reverse and time done!
+ //Repeat and reverse and time done!
if (!animator->cur_repeat_cnt)
{
animator->on_animating = EINA_FALSE;
}
/**
- * Get the value of reverse mode.
+ * Get the value of reverse mode.
*
* @param[in] animator Animator object
- * @return EINA_TRUE is reverse mode
+ * @return EINA_TRUE is reverse mode
*
- * @ingroup Animator
+ * @ingroup Animator
*/
EAPI Eina_Bool
elm_animator_auto_reverse_get(const Elm_Animator *animator)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return EINA_FALSE;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator, EINA_FALSE);
return animator->auto_reverse;
}
* @param[in] animator Animator object
* @return Repeat count
*
- * @ingroup Animator
+ * @ingroup Animator
*/
EAPI unsigned int
elm_animator_repeat_get(const Elm_Animator *animator)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return 0;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator, 0);
return animator->repeat_cnt;
}
/**
- * Set auto reverse function.
+ * Set auto reverse function.
*
* @param[in] animator Animator object
* @param[in] reverse Reverse or not
- *
- * @ingroup Animator
+ *
+ * @ingroup Animator
*/
EAPI void
elm_animator_auto_reverse_set(Elm_Animator *animator, Eina_Bool reverse)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
if (animator->auto_reverse == reverse) return;
animator->auto_reverse = reverse;
if (reverse)
}
/**
- * Set the animation acceleration style.
+ * Set the animation acceleration style.
*
* @param[in] animator Animator object
- * @param[in] cs Curve style. Default is ELM_ANIMATOR_CURVE_LINEAR
+ * @param[in] cs Curve style. Default is ELM_ANIMATOR_CURVE_LINEAR
*
* @ingroup Animator
*/
elm_animator_curve_style_set(Elm_Animator *animator,
Elm_Animator_Curve_Style cs)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
switch (cs)
{
case ELM_ANIMATOR_CURVE_LINEAR:
}
/**
- * Set the operation duration.
+ * Set the operation duration.
*
* @param[in] animator Animator object
- * @param[in] duration Duration in second
+ * @param[in] duration Duration in second
*
* @ingroup Animator
*/
EAPI void
elm_animator_duration_set(Elm_Animator *animator, double duration)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
if (animator->on_animating) return;
animator->duration = duration;
}
/**
- * Set the callback function for animator operation.
+ * Set the callback function for animator operation.
* The range of callback function frame data is to 0 ~ 1
- * User can refer this frame value for one's animation frame data.
+ * User can refer this frame value for one's animation frame data.
* @param[in] animator Animator object
- * @param[in] func Callback function pointer
- * @param[in] data Callback function user argument
+ * @param[in] func Callback function pointer
+ * @param[in] data Callback function user argument
*
* @ingroup Animator
*/
Elm_Animator_Operation_Cb func,
void *data)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
if (animator->on_animating) return;
animator->animator_op = func;
animator->animator_arg = data;
}
/**
- * Add new animator.
+ * Add new animator.
*
* @param[in] parent Parent object
- * @return animator object
+ * @return animator object
*
* @ingroup Animator
*/
{
Elm_Animator *animator = ELM_NEW(Elm_Animator);
if (!animator) return NULL;
+ EINA_MAGIC_SET(animator, ELM_ANIMATOR_MAGIC);
animator->parent = parent;
- animator->magic = MAGIC_OBJ_ANIMATOR;
elm_animator_auto_reverse_set(animator, EINA_FALSE);
elm_animator_curve_style_set(animator, ELM_ANIMATOR_CURVE_LINEAR);
if (parent)
evas_object_event_callback_add(parent, EVAS_CALLBACK_DEL,
_animator_parent_del, animator);
-
return animator;
}
/**
* Get the status for the animator operation.
*
- * @param[in] animator Animator object
- * @return EINA_TRUE is animator is operating.
+ * @param[in] animator Animator object
+ * @return EINA_TRUE is animator is operating.
*
* @ingroup Animator
*/
EAPI Eina_Bool
elm_animator_operating_get(const Elm_Animator *animator)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return EINA_FALSE;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator, EINA_FALSE);
return animator->on_animating;
}
/**
- * Delete animator.
+ * Delete animator.
*
- * @param[in] animator Animator object
+ * @param[in] animator Animator object
*
* @ingroup Animator
*/
EAPI void
elm_animator_del(Elm_Animator *animator)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
_delete_animator(animator);
if (animator->parent)
evas_object_event_callback_del(animator->parent, EVAS_CALLBACK_DEL,
_animator_parent_del);
- memset(animator, 0x0, sizeof(Elm_Animator));
+ EINA_MAGIC_SET(animator, EINA_MAGIC_NONE);
free(animator);
}
/**
- * Set the callback function for the animator end.
+ * Set the callback function for the animator end.
*
- * @param[in] animator Animator object
- * @param[in] func Callback function pointer
- * @param[in] data Callback function user argument
+ * @param[in] animator Animator object
+ * @param[in] func Callback function pointe
+ * @param[in] data Callback function user argument
*
* @ingroup Animator
*/
Elm_Animator_Completion_Cb func,
void *data)
{
- if (!animator || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
if (animator->on_animating) return;
animator->completion_op = func;
animator->completion_arg = data;
EAPI void
elm_animator_pause(Elm_Animator *animator)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
if (!animator->on_animating) return;
ecore_animator_freeze(animator->animator);
}
EAPI void
elm_animator_resume(Elm_Animator *animator)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
if (!animator->on_animating) return;
ecore_animator_thaw(animator->animator);
}
/**
* Stop animator.
*
- * @param[in] animator Animator object
+ * @param[in] animator Animator object
*
* @ingroup Animator
*/
EAPI void
elm_animator_stop(Elm_Animator *animator)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
animator->on_animating = EINA_FALSE;
_delete_animator(animator);
}
EAPI void
elm_animator_repeat_set(Elm_Animator *animator, unsigned int repeat_cnt)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
if (!animator->auto_reverse) animator->repeat_cnt = repeat_cnt;
else
animator->repeat_cnt = _animator_compute_reverse_repeat_count(repeat_cnt);
EAPI void
elm_animator_animate(Elm_Animator *animator)
{
- if ((!animator) || (animator->magic != MAGIC_OBJ_ANIMATOR)) return;
+ ELM_ANIMATOR_CHECK_OR_RETURN(animator);
if (!animator->animator_op) return;
animator->begin_time = ecore_loop_time_get();
animator->cur_repeat_cnt = animator->repeat_cnt;