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 {
{
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);
}
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;
(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;
}
* @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
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
///////////////////////////////////////////////////////////////////////////////