From 1ee046765af8daadf576cf776dd49e8968250ca0 Mon Sep 17 00:00:00 2001 From: Gustavo Lima Chaves Date: Mon, 28 May 2012 20:35:29 +0000 Subject: [PATCH] [elm] Image animation should be in the base (image), not just icon. SVN revision: 71467 --- legacy/elementary/src/lib/elm_icon.c | 90 +------------- legacy/elementary/src/lib/elm_image.c | 120 ++++++++++++++++++- legacy/elementary/src/lib/elm_image.h | 102 ++++++++++++++++ legacy/elementary/src/lib/elm_widget_image.h | 8 ++ 4 files changed, 235 insertions(+), 85 deletions(-) diff --git a/legacy/elementary/src/lib/elm_icon.c b/legacy/elementary/src/lib/elm_icon.c index 6d6155fee0..693926fbf0 100644 --- a/legacy/elementary/src/lib/elm_icon.c +++ b/legacy/elementary/src/lib/elm_icon.c @@ -47,14 +47,6 @@ struct _Elm_Icon_Smart_Data int in_eval; - /* for animation feature */ - Ecore_Timer *timer; - int frame_count; - int cur_frame; - double duration; - - Eina_Bool anim : 1; - Eina_Bool play : 1; Eina_Bool is_video : 1; }; @@ -532,31 +524,6 @@ _elm_icon_smart_theme(Evas_Object *obj) return EINA_TRUE; } -static Eina_Bool -_elm_icon_animate_cb(void *data) -{ - Elm_Icon_Smart_Data *sd = data; - Evas_Object *img_obj; - - if (!sd->anim) return ECORE_CALLBACK_CANCEL; - - img_obj = elm_image_object_get(ELM_WIDGET_DATA(sd)->obj); - - sd->cur_frame++; - if (sd->cur_frame > sd->frame_count) - sd->cur_frame = sd->cur_frame % sd->frame_count; - - evas_object_image_animated_frame_set(img_obj, sd->cur_frame); - - sd->duration = evas_object_image_animated_frame_duration_get - (img_obj, sd->cur_frame, 0); - - if (sd->duration > 0) - ecore_timer_interval_set(sd->timer, sd->duration); - - return ECORE_CALLBACK_RENEW; -} - static Eina_Bool _icon_standard_set(Evas_Object *obj, const char *name) @@ -726,9 +693,6 @@ _elm_icon_smart_del(Evas_Object *obj) ecore_event_handler_del(sd->thumb.eeh); #endif - if (sd->timer) - ecore_timer_del(sd->timer); - _edje_signals_free(sd); ELM_WIDGET_CLASS(_elm_icon_parent_sc)->base.del(obj); @@ -938,45 +902,20 @@ elm_icon_animated_available_get(const Evas_Object *obj) } EAPI void -elm_icon_animated_set(Evas_Object *obj, Eina_Bool anim) +elm_icon_animated_set(Evas_Object *obj, + Eina_Bool anim) { - Evas_Object *img_obj; - ELM_ICON_CHECK(obj); - ELM_ICON_DATA_GET(obj, sd); - anim = !!anim; - if (sd->anim == anim) return; - - img_obj = elm_image_object_get(obj); - if (!evas_object_image_animated_get(img_obj)) return; - - if (anim) - { - sd->frame_count = evas_object_image_animated_frame_count_get(img_obj); - sd->cur_frame = 1; - sd->duration = evas_object_image_animated_frame_duration_get - (img_obj, sd->cur_frame, 0); - evas_object_image_animated_frame_set(img_obj, sd->cur_frame); - } - else - { - sd->frame_count = -1; - sd->cur_frame = -1; - sd->duration = -1; - } - sd->anim = anim; - - return; + return elm_image_animated_set(obj, anim); } EAPI Eina_Bool elm_icon_animated_get(const Evas_Object *obj) { ELM_ICON_CHECK(obj) EINA_FALSE; - ELM_ICON_DATA_GET(obj, sd); - return sd->anim; + return elm_image_animated_get(obj); } EAPI void @@ -984,33 +923,16 @@ elm_icon_animated_play_set(Evas_Object *obj, Eina_Bool play) { ELM_ICON_CHECK(obj); - ELM_ICON_DATA_GET(obj, sd); - if (!sd->anim) return; - if (sd->play == play) return; - - if (play) - { - sd->timer = ecore_timer_add(sd->duration, _elm_icon_animate_cb, sd); - } - else - { - if (sd->timer) - { - ecore_timer_del(sd->timer); - sd->timer = NULL; - } - } - sd->play = play; + elm_image_animated_play_set(obj, play); } EAPI Eina_Bool elm_icon_animated_play_get(const Evas_Object *obj) { ELM_ICON_CHECK(obj) EINA_FALSE; - ELM_ICON_DATA_GET(obj, sd); - return sd->play; + return elm_image_animated_play_get(obj); } EAPI Eina_Bool diff --git a/legacy/elementary/src/lib/elm_image.c b/legacy/elementary/src/lib/elm_image.c index 0dc31a1ce4..cb160c2624 100644 --- a/legacy/elementary/src/lib/elm_image.c +++ b/legacy/elementary/src/lib/elm_image.c @@ -72,6 +72,28 @@ _on_mouse_up(void *data, evas_object_smart_callback_call(data, SIG_CLICKED, NULL); } +static Eina_Bool +_elm_image_animate_cb(void *data) +{ + Elm_Image_Smart_Data *sd = data; + + if (!sd->anim) return ECORE_CALLBACK_CANCEL; + + sd->cur_frame++; + if (sd->cur_frame > sd->frame_count) + sd->cur_frame = sd->cur_frame % sd->frame_count; + + evas_object_image_animated_frame_set(sd->img, sd->cur_frame); + + sd->frame_duration = evas_object_image_animated_frame_duration_get + (sd->img, sd->cur_frame, 0); + + if (sd->frame_duration > 0) + ecore_timer_interval_set(sd->anim_timer, sd->frame_duration); + + return ECORE_CALLBACK_RENEW; +} + static Evas_Object * _img_new(Evas_Object *obj) { @@ -573,7 +595,8 @@ _elm_image_drag_n_drop_cb(void *elm_obj, if (ELM_IMAGE_CLASS(ELM_WIDGET_DATA(sd)->api)->file_set (obj, drop->data, NULL)) { - printf("dnd: %s, %s, %s", elm_widget_type_get(elm_obj), SIG_DND, drop->data); + printf("dnd: %s, %s, %s", elm_widget_type_get(elm_obj), + SIG_DND, (char *)drop->data); evas_object_smart_callback_call(elm_obj, SIG_DND, drop->data); return EINA_TRUE; @@ -612,6 +635,9 @@ _elm_image_smart_del(Evas_Object *obj) { ELM_IMAGE_DATA_GET(obj, sd); + if (sd->anim_timer) + ecore_timer_del(sd->anim_timer); + evas_object_del(sd->img); if (sd->prev_img) evas_object_del(sd->prev_img); @@ -1326,3 +1352,95 @@ elm_image_aspect_fixed_get(const Evas_Object *obj) return ELM_IMAGE_CLASS(ELM_WIDGET_DATA(sd)->api)->aspect_fixed_get(obj); } + +EAPI Eina_Bool +elm_image_animated_available_get(const Evas_Object *obj) +{ + ELM_IMAGE_CHECK(obj) EINA_FALSE; + ELM_IMAGE_DATA_GET(obj, sd); + + if (sd->edje) return EINA_FALSE; + + return evas_object_image_animated_get(elm_image_object_get(obj)); +} + +EAPI void +elm_image_animated_set(Evas_Object *obj, + Eina_Bool anim) +{ + ELM_IMAGE_CHECK(obj); + ELM_IMAGE_DATA_GET(obj, sd); + + anim = !!anim; + if (sd->anim == anim) return; + + if (sd->edje) return; + + sd->img = elm_image_object_get(obj); + if (!evas_object_image_animated_get(sd->img)) return; + + if (anim) + { + sd->frame_count = evas_object_image_animated_frame_count_get(sd->img); + sd->cur_frame = 1; + sd->frame_duration = + evas_object_image_animated_frame_duration_get + (sd->img, sd->cur_frame, 0); + evas_object_image_animated_frame_set(sd->img, sd->cur_frame); + } + else + { + sd->frame_count = -1; + sd->cur_frame = -1; + sd->frame_duration = -1; + } + sd->anim = anim; + + return; +} + +EAPI Eina_Bool +elm_image_animated_get(const Evas_Object *obj) +{ + ELM_IMAGE_CHECK(obj) EINA_FALSE; + ELM_IMAGE_DATA_GET(obj, sd); + + return sd->anim; +} + +EAPI void +elm_image_animated_play_set(Evas_Object *obj, + Eina_Bool play) +{ + ELM_IMAGE_CHECK(obj); + ELM_IMAGE_DATA_GET(obj, sd); + + if (!sd->anim) return; + if (sd->play == play) return; + + if (sd->edje) return; + + if (play) + { + sd->anim_timer = ecore_timer_add + (sd->frame_duration, _elm_image_animate_cb, sd); + } + else + { + if (sd->anim_timer) + { + ecore_timer_del(sd->anim_timer); + sd->anim_timer = NULL; + } + } + sd->play = play; +} + +EAPI Eina_Bool +elm_image_animated_play_get(const Evas_Object *obj) +{ + ELM_IMAGE_CHECK(obj) EINA_FALSE; + ELM_IMAGE_DATA_GET(obj, sd); + + return sd->play; +} diff --git a/legacy/elementary/src/lib/elm_image.h b/legacy/elementary/src/lib/elm_image.h index c4a32db815..2b7b9632d1 100644 --- a/legacy/elementary/src/lib/elm_image.h +++ b/legacy/elementary/src/lib/elm_image.h @@ -424,6 +424,108 @@ EAPI void elm_image_aspect_fixed_set(Evas_Object *obj, Eina_Bool fix */ EAPI Eina_Bool elm_image_aspect_fixed_get(const Evas_Object *obj); +/** + * Get whether an image object supports animation or not. + * + * @param obj The image object + * @return @c EINA_TRUE if the image supports animation, + * @c EINA_FALSE otherwise. + * + * This function returns if this Elementary image object's internal + * image can be animated. Currently Evas only supports GIF + * animation. If the return value is @b EINA_FALSE, other + * @c elm_image_animated_xxx API calls won't work. + * + * @see elm_image_animated_set() + * + * @ingroup Image + * @since 1.1 + */ +EAPI Eina_Bool elm_image_animated_available_get(const Evas_Object *obj); + +/** + * Set whether an image object (which supports animation) is to + * animate itself or not. + * + * @param obj The image object + + * @param animated @c EINA_TRUE if the object is to animate itself, + * @c EINA_FALSE otherwise. Default is @c EINA_FALSE. + * + * An image object, even if it supports animation, will be displayed + * by default without animation. Call this function with @a animated + * set to @c EINA_TRUE to enable its animation. To start or stop the + * animation, actually, use elm_image_animated_play_set(). + * + * @see elm_image_animated_get() + * @see elm_image_animated_available_get() + * @see elm_image_animated_play_set() + * + * @ingroup Image + * @since 1.1 + */ +EAPI void elm_image_animated_set(Evas_Object *obj, Eina_Bool animated); + +/** + * Get whether an image object has animation enabled or not. + * + * @param obj The image object + * + * @return @c EINA_TRUE if the image has animation enabled, + * @c EINA_FALSE otherwise. + * + * @see elm_image_animated_set() + * + * @ingroup Image + * @since 1.1 + */ +EAPI Eina_Bool elm_image_animated_get(const Evas_Object *obj); + +/** + * Start or stop an image object's animation. + * + * @param obj The image object + * @param play @c EINA_TRUE to start the animation, @c EINA_FALSE + * otherwise. Default is @c EINA_FALSE. + * + * To actually start playing any image object's animation, if it + * supports it, one must do something like: + * + * @code + * if (elm_image_animated_available_get(img)) + * { + * elm_image_animated_set(img, EINA_TRUE); + * elm_image_animated_play_set(img, EINA_TRUE); + * } + * @endcode + * + * elm_image_animated_set() will enable animation on the image, but + * not start it yet. This is the function one uses to start and + * stop animations on image objects. + * + * @see elm_image_animated_available_get() + * @see elm_image_animated_set() + * @see elm_image_animated_play_get() + * + * @ingroup Image + * @since 1.1 + */ +EAPI void elm_image_animated_play_set(Evas_Object *obj, Eina_Bool play); + +/** + * Get whether an image object is under animation or not. + * + * @param obj The image object + * @return @c EINA_TRUE, if the image is being animated, @c EINA_FALSE + * otherwise. + * + * @see elm_image_animated_play_get() + * + * @ingroup Image + * @since 1.1 + */ +EAPI Eina_Bool elm_image_animated_play_get(const Evas_Object *obj); + /** * @} */ diff --git a/legacy/elementary/src/lib/elm_widget_image.h b/legacy/elementary/src/lib/elm_widget_image.h index 93a0213aac..23b8285d16 100644 --- a/legacy/elementary/src/lib/elm_widget_image.h +++ b/legacy/elementary/src/lib/elm_widget_image.h @@ -206,6 +206,10 @@ struct _Elm_Image_Smart_Data Eina_List *edje_signals; + int frame_count; + int cur_frame; + double frame_duration; + Eina_Bool aspect_fixed : 1; Eina_Bool fill_inside : 1; Eina_Bool scale_down : 1; @@ -216,6 +220,10 @@ struct _Elm_Image_Smart_Data Eina_Bool show : 1; Eina_Bool edit : 1; Eina_Bool edje : 1; + Eina_Bool anim : 1; + Eina_Bool play : 1; + + Ecore_Timer *anim_timer; }; /**