From d254e927da2379b54e8b1ab431b03af29e675dee Mon Sep 17 00:00:00 2001 From: hermet Date: Thu, 7 Apr 2011 05:34:11 +0000 Subject: [PATCH] elementary/transit - added chain transit features. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@58406 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/elm_transit.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/src/lib/elm_transit.c b/src/lib/elm_transit.c index 09d47e0..ba6a4fc 100644 --- a/src/lib/elm_transit.c +++ b/src/lib/elm_transit.c @@ -60,9 +60,11 @@ struct _Elm_Transit Ecore_Animator *animator; Eina_List *effect_list; Eina_List *objs; + Elm_Transit *prev_chain_transit; + Eina_List *next_chain_transits; Elm_Transit_Tween_Mode tween_mode; struct { - void (*func) (void *data, Elm_Transit *transit); + Elm_Transit_Effect_End_Cb func; void *arg; } del_data; struct { @@ -221,6 +223,16 @@ _elm_transit_del(Elm_Transit *transit) { Eina_List *elist, *elist_next; Elm_Transit_Effect_Module *effect_module; + Elm_Transit *chain_transit; + + EINA_LIST_FOREACH_SAFE(transit->next_chain_transits, elist, elist_next, chain_transit) + { + if (transit->prev_chain_transit) + transit->prev_chain_transit->next_chain_transits = eina_list_remove(transit->prev_chain_transit->next_chain_transits, transit); + chain_transit->prev_chain_transit = NULL; + } + + eina_list_free(transit->next_chain_transits); if (transit->animator) ecore_animator_del(transit->animator); @@ -239,6 +251,16 @@ _elm_transit_del(Elm_Transit *transit) } static void +_chain_transits_go(Elm_Transit *transit) +{ + Eina_List *elist, *elist_next; + Elm_Transit *chain_transit; + + EINA_LIST_FOREACH_SAFE(transit->next_chain_transits, elist, elist_next, chain_transit) + elm_transit_go(chain_transit); +} + +static void _transit_animate_op(Elm_Transit *transit, double progress) { Eina_List *elist; @@ -301,6 +323,10 @@ _animator_animate_cb(void *data) (transit->repeat.current == transit->repeat.count) && ((!transit->auto_reverse) || transit->repeat.reverse)) { + /* run chain transit */ + if (transit->next_chain_transits) + _chain_transits_go(transit); + elm_transit_del(transit); return ECORE_CALLBACK_CANCEL; } @@ -984,7 +1010,7 @@ elm_transit_objects_final_state_keep_set(Elm_Transit *transit, Eina_Bool state_k * @param transit The transit object. * @return EINA_TRUE means the states of the objects will be reset. * If @p transit is NULL, EINA_FALSE is returned - + * * @ingroup Transit */ EAPI Eina_Bool @@ -994,6 +1020,50 @@ elm_transit_objects_final_state_keep_get(const Elm_Transit *transit) return transit->state_keep; } +/** + * Makes the chain relationship between two transits. + * + * @note @p transit can not be NULL. Transit would have multiple chain transits. + * @note @p chain_transit can not be NULL. Chain transits could be chained to the only one transit. + * + * @param transit The transit object. + * @param chain_transit The chain transit object. This transit will be operated * after transit is done. + * + * @ingroup Transit + */ +EAPI void +elm_transit_chain_transit_add(Elm_Transit *transit, Elm_Transit *chain_transit) +{ + ELM_TRANSIT_CHECK_OR_RETURN(transit); + ELM_TRANSIT_CHECK_OR_RETURN(chain_transit); + + if (transit == chain_transit) return; + if (transit == chain_transit->prev_chain_transit) return; + + if (chain_transit->prev_chain_transit) + chain_transit->prev_chain_transit->next_chain_transits = eina_list_remove(chain_transit->prev_chain_transit->next_chain_transits, chain_transit); + + chain_transit->prev_chain_transit = transit; + transit->next_chain_transits = eina_list_append(transit->next_chain_transits, chain_transit); +} + +/** + * Get the current chain transit list. + * + * @note @p transit can not be NULL. + * + * @param transit The transit object. + * @return chain transit list. + * + * @ingroup Transit + */ +EAPI Eina_List * +elm_transit_chain_transits_get(const Elm_Transit * transit) +{ + ELM_TRANSIT_CHECK_OR_RETURN(transit); + return transit->next_chain_transits; +} + /////////////////////////////////////////////////////////////////////////////// //Resizing Effect /////////////////////////////////////////////////////////////////////////////// -- 2.7.4