typedef void Elm_Transit_Effect;
typedef void (*Elm_Transit_Effect_Transition_Cb) (Elm_Transit_Effect *effect, Elm_Transit *transit, double progress);
typedef void (*Elm_Transit_Effect_End_Cb) (Elm_Transit_Effect *effect, Elm_Transit *transit);
+ typedef void (*Elm_Transit_Del_Cb) (void *data, Elm_Transit *transit);
EAPI Elm_Transit *elm_transit_add(void);
EAPI void elm_transit_del(Elm_Transit *transit) EINA_ARG_NONNULL(1);
EINA_DEPRECATED EAPI Eina_Bool elm_transit_event_block_get(const Elm_Transit *transit) EINA_ARG_NONNULL(1);
EAPI void elm_transit_event_enabled_set(Elm_Transit *transit, Eina_Bool enabled) EINA_ARG_NONNULL(1);
EAPI Eina_Bool elm_transit_event_enabled_get(const Elm_Transit *transit) EINA_ARG_NONNULL(1);
- EAPI void elm_transit_del_cb_set(Elm_Transit *transit, void (*cb)(void *data, Elm_Transit* transit), void *data) EINA_ARG_NONNULL(1);
+ EAPI void elm_transit_del_cb_set(Elm_Transit *transit, Elm_Transit_Del_Cb cb, void *data) EINA_ARG_NONNULL(1);
EAPI void elm_transit_auto_reverse_set(Elm_Transit *transit, Eina_Bool reverse) EINA_ARG_NONNULL(1);
EAPI Eina_Bool elm_transit_auto_reverse_get(const Elm_Transit *transit) EINA_ARG_NONNULL(1);
EAPI void elm_transit_repeat_times_set(Elm_Transit *transit, int repeat) EINA_ARG_NONNULL(1);
EAPI Eina_Bool elm_transit_paused_get(const Elm_Transit *transit) EINA_ARG_NONNULL(1);
EAPI double elm_transit_progress_value_get(const Elm_Transit *transit) EINA_ARG_NONNULL(1);
EAPI void elm_transit_chain_transit_add(Elm_Transit *transit, Elm_Transit *chain_transit) EINA_ARG_NONNULL(1, 2);
+ EAPI void elm_transit_chain_transit_del(Elm_Transit *transit, Elm_Transit *chain_transit) EINA_ARG_NONNULL(1, 2);
EAPI Eina_List *elm_transit_chain_transits_get(const Elm_Transit *transit);
EAPI Elm_Transit_Effect *elm_transit_effect_resizing_add(Elm_Transit* transit, Evas_Coord from_w, Evas_Coord from_h, Evas_Coord to_w, Evas_Coord to_h);
Eina_List *next_chain_transits;
Elm_Transit_Tween_Mode tween_mode;
struct {
- Elm_Transit_Effect_End_Cb func;
+ Elm_Transit_Del_Cb func;
void *arg;
} del_data;
struct {
Eina_Bool event_enabled : 1;
Eina_Bool deleted : 1;
Eina_Bool state_keep : 1;
+ Eina_Bool finished : 1;
};
struct _Elm_Transit_Effect_Module
typedef struct _Elm_Transit_Effect_Module Elm_Transit_Effect_Module;
typedef struct _Elm_Transit_Obj_Data Elm_Transit_Obj_Data;
typedef struct _Elm_Transit_Obj_State Elm_Transit_Obj_State;
+
static void _transit_obj_data_update(Elm_Transit *transit, Evas_Object *obj);
static void _transit_obj_data_recover(Elm_Transit *transit, Evas_Object *obj);
static void _transit_obj_states_save(Evas_Object *obj, Elm_Transit_Obj_Data *obj_data);
static void _transit_effect_del(Elm_Transit *transit, Elm_Transit_Effect_Module *effect_module);
static void _transit_remove_dead_effects(Elm_Transit *transit);
static void _transit_del(Elm_Transit *transit);
-static void _transit_chain_transits_go(Elm_Transit *transit);
static void _transit_animate_op(Elm_Transit *transit, double progress);
static Eina_Bool _transit_animate_cb(void *data);
Elm_Transit *chain_transit;
Eina_List *elist, *elist_next;
- 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);
+ //remove effects
while (transit->effect_list)
{
effect_module = EINA_INLIST_CONTAINER_GET(transit->effect_list, Elm_Transit_Effect_Module);
_transit_effect_del(transit, effect_module);
}
+ //remove objects.
while (transit->objs)
_transit_obj_remove(transit, eina_list_data_get(transit->objs));
if (transit->del_data.func)
transit->del_data.func(transit->del_data.arg, transit);
- EINA_MAGIC_SET(transit, EINA_MAGIC_NONE);
- free(transit);
-}
+ //cut off the chain transit relationship
+ EINA_LIST_FOREACH_SAFE(transit->next_chain_transits, elist, elist_next, chain_transit)
+ chain_transit->prev_chain_transit = NULL;
-static void
-_transit_chain_transits_go(Elm_Transit *transit)
-{
- Eina_List *elist, *elist_next;
- Elm_Transit *chain_transit;
- Evas_Object *obj;
+ if (transit->prev_chain_transit)
+ transit->prev_chain_transit->next_chain_transits =
+ eina_list_remove(transit->prev_chain_transit->next_chain_transits, transit);
- EINA_LIST_FOREACH(transit->objs, elist, obj)
- _transit_obj_data_recover(transit, obj);
+ // run chain transits
+ if (transit->finished && transit->next_chain_transits)
+ {
+ EINA_LIST_FOREACH_SAFE(transit->next_chain_transits, elist, elist_next, chain_transit)
+ elm_transit_go(chain_transit);
+ }
- EINA_LIST_FOREACH_SAFE(transit->next_chain_transits, elist, elist_next, chain_transit)
- elm_transit_go(chain_transit);
+ eina_list_free(transit->next_chain_transits);
+
+ EINA_MAGIC_SET(transit, EINA_MAGIC_NONE);
+ free(transit);
}
static void
(transit->repeat.current == transit->repeat.count) &&
((!transit->auto_reverse) || transit->repeat.reverse))
{
- /* run chain transit */
- if (transit->next_chain_transits)
- _transit_chain_transits_go(transit);
-
+ transit->finished = EINA_TRUE;
elm_transit_del(transit);
return ECORE_CALLBACK_CANCEL;
}
transit->next_chain_transits = eina_list_append(transit->next_chain_transits, chain_transit);
}
+EAPI void
+elm_transit_chain_transit_del(Elm_Transit *transit, Elm_Transit *chain_transit)
+{
+ ELM_TRANSIT_CHECK_OR_RETURN(transit);
+ ELM_TRANSIT_CHECK_OR_RETURN(chain_transit);
+
+ if (chain_transit->prev_chain_transit != transit)
+ {
+ WRN("These two transit does not have the chain relationship! : transit=%p, chain_transit=%p", transit, chain_transit);
+ return;
+ }
+
+ chain_transit->prev_chain_transit = NULL;
+ transit->next_chain_transits = eina_list_remove(transit->next_chain_transits, chain_transit);
+}
+
/**
* Get the current chain transit list.
*