typedef struct _Elm_Obj_State Elm_Obj_State;
static void
-_elm_transit_objs_states_save(Elm_Transit *transit)
+_elm_transit_obj_states_save(Evas_Object *obj)
{
- Eina_List *list;
- Evas_Object *obj;
Elm_Obj_Data *obj_data;
Elm_Obj_State *state;
- EINA_LIST_FOREACH(transit->objs, list, obj)
- {
- obj_data = evas_object_data_get(obj, _transit_key);
- if (!obj_data) continue;
- state = calloc(1, sizeof(Elm_Obj_State));
- if (!state) continue;
- evas_object_geometry_get(obj, &state->x, &state->y, &state->w, &state->h);
- evas_object_color_get(obj, &state->r, &state->g, &state->b, &state->a);
- state->visible = evas_object_visible_get(obj);
- state->map_enabled = evas_object_map_enable_get(obj);
- if (evas_object_map_get(obj))
- state->map = evas_map_dup(evas_object_map_get(obj));
- obj_data->state = state;
- }
+ obj_data = evas_object_data_get(obj, _transit_key);
+ if ((!obj_data) || (obj_data->state)) return;
+ state = calloc(1, sizeof(Elm_Obj_State));
+ if (!state) return;
+ evas_object_geometry_get(obj, &state->x, &state->y, &state->w, &state->h);
+ evas_object_color_get(obj, &state->r, &state->g, &state->b, &state->a);
+ state->visible = evas_object_visible_get(obj);
+ state->map_enabled = evas_object_map_enable_get(obj);
+ if (evas_object_map_get(obj))
+ state->map = evas_map_dup(evas_object_map_get(obj));
+ obj_data->state = state;
}
static void
static void
_elm_transit_object_remove(Elm_Transit *transit, Evas_Object *obj)
{
+ Eina_List *l;
Elm_Obj_Data *obj_data = evas_object_data_del(obj, _transit_key);
Elm_Obj_State *state = obj_data->state;
evas_object_pass_events_set(obj, obj_data->pass_events);
- //recover the states of the object.
if (state)
{
- evas_object_move(obj, state->x, state->y);
- evas_object_resize(obj, state->w, state->h);
- evas_object_color_set(obj, state->r, state->g, state->b, state->a);
- if (state->visible) evas_object_show(obj);
- else evas_object_hide(obj);
- if (state->map_enabled)
- evas_object_map_enable_set(obj, EINA_TRUE);
- else
- evas_object_map_enable_set(obj, EINA_FALSE);
- if (state->map)
- evas_object_map_set(obj, state->map);
+ //recover the states of the object.
+ if (!transit->state_keep)
+ {
+ evas_object_move(obj, state->x, state->y);
+ evas_object_resize(obj, state->w, state->h);
+ evas_object_color_set(obj, state->r, state->g, state->b, state->a);
+ if (state->visible) evas_object_show(obj);
+ else evas_object_hide(obj);
+ if (state->map_enabled)
+ evas_object_map_enable_set(obj, EINA_TRUE);
+ else
+ evas_object_map_enable_set(obj, EINA_FALSE);
+ if (state->map)
+ evas_object_map_set(obj, state->map);
+
+ }
free(state);
}
free(obj_data);
- transit->objs = eina_list_remove(transit->objs, obj);
+
+ //remove duplicated objects
+ //TODO: Need to consider about optimizing here
+ while(1)
+ {
+ if (!eina_list_data_find_list(transit->objs, obj))
+ break;
+ transit->objs = eina_list_remove(transit->objs, obj);
+ }
+
evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL,
_elm_transit_object_remove_cb);
}
EINA_SAFETY_ON_NULL_RETURN(obj);
Elm_Obj_Data *obj_data;
- if (transit->animator) return;
-
obj_data = evas_object_data_get(obj, _transit_key);
- if (obj_data)
+ if ((obj_data) && (obj_data->transit != transit))
+ elm_transit_object_remove(obj_data->transit, obj);
+
+ if ((!obj_data) || (obj_data->transit != transit))
{
- if (obj_data->transit == transit) return;
- elm_transit_object_remove(obj_data->transit, obj);
- }
+ obj_data = ELM_NEW(Elm_Obj_Data);
+ obj_data->pass_events = evas_object_pass_events_get(obj);
+ obj_data->transit = transit;
+ evas_object_data_set(obj, _transit_key, obj_data);
+ if (!transit->event_enabled)
+ evas_object_pass_events_set(obj, EINA_TRUE);
- obj_data = ELM_NEW(Elm_Obj_Data);
- obj_data->pass_events = evas_object_pass_events_get(obj);
- obj_data->transit = transit;
- evas_object_data_set(obj, _transit_key, obj_data);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
+ _elm_transit_object_remove_cb,
+ transit);
+ }
transit->objs = eina_list_append(transit->objs, obj);
- if (!transit->event_enabled)
- evas_object_pass_events_set(obj, EINA_TRUE);
+ if (!transit->state_keep)
+ _elm_transit_obj_states_save(obj);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
- _elm_transit_object_remove_cb, transit);
}
/**
EINA_SAFETY_ON_NULL_RETURN(obj);
Elm_Obj_Data *obj_data;
- if (transit->animator) return;
-
obj_data = evas_object_data_get(obj, _transit_key);
if ((!obj_data) || (obj_data->transit != transit)) return;
if (transit->animator)
ecore_animator_del(transit->animator);
- if (!transit->state_keep)
- _elm_transit_objs_states_save(transit);
-
transit->time.paused = 0;
transit->time.delayed = 0;
transit->time.begin = ecore_loop_time_get();
EAPI void
elm_transit_objects_final_state_keep_set(Elm_Transit *transit, Eina_Bool state_keep)
{
+ Eina_List *list;
+ Evas_Object *obj;
+
ELM_TRANSIT_CHECK_OR_RETURN(transit);
if (transit->state_keep == state_keep) return;
if (transit->animator) return;
transit->state_keep = !!state_keep;
+ if (!state_keep)
+ {
+ EINA_LIST_FOREACH(transit->objs, list, obj)
+ _elm_transit_obj_states_save(obj);
+ }
}
/**