efl_canvas_object: get rid of event_animation set/get

the API is a little bit problematic. The API takes events as an
parameter. However, only the hide and show events can be used, because
move for example is not intercepted, which leads to a situation that you
cannot attach a translation animation to the event. Further more,
handling the animations directory instead of pipeing them through events
seems to be a little bit easier as the case study of the previous events
have shown. Further more, we should never ever overwrite the
callback_call function of a eo base object, those methods are an
incredible hotpath, by the time we would have 1-2 animations on a
object, the event submission would be significetly slowned down.

ref T7555

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Differential Revision: https://phab.enlightenment.org/D8009
This commit is contained in:
Marcel Hollerbach 2019-02-23 13:21:40 +01:00
parent f1ad1559b7
commit 422ee8d323
8 changed files with 0 additions and 438 deletions

View File

@ -994,7 +994,6 @@ bin/elementary/test_efl_anim_scale.c \
bin/elementary/test_efl_anim_translate.c \
bin/elementary/test_efl_anim_group_parallel.c \
bin/elementary/test_efl_anim_group_sequential.c \
bin/elementary/test_efl_anim_event_anim.c \
bin/elementary/test_efl_anim_pause.c \
bin/elementary/test_efl_anim_repeat.c \
bin/elementary/test_efl_anim_start_delay.c \

View File

@ -38,7 +38,6 @@ test_efl_anim_scale.c \
test_efl_anim_translate.c \
test_efl_anim_group_parallel.c \
test_efl_anim_group_sequential.c \
test_efl_anim_event_anim.c \
test_efl_anim_pause.c \
test_efl_anim_repeat.c \
test_efl_anim_start_delay.c \

View File

@ -35,7 +35,6 @@ elementary_test_src = [
'test_efl_anim_translate.c',
'test_efl_anim_group_parallel.c',
'test_efl_anim_group_sequential.c',
'test_efl_anim_event_anim.c',
'test_efl_anim_pause.c',
'test_efl_anim_repeat.c',
'test_efl_anim_start_delay.c',

View File

@ -365,7 +365,6 @@ void test_efl_anim_translate(void *data, Evas_Object *obj, void *event_info);
void test_efl_anim_translate_absolute(void *data, Evas_Object *obj, void *event_info);
void test_efl_anim_group_parallel(void *data, Evas_Object *obj, void *event_info);
void test_efl_anim_group_sequential(void *data, Evas_Object *obj, void *event_info);
void test_efl_anim_event_anim(void *data, Evas_Object *obj, void *event_info);
void test_efl_anim_pause(void *data, Evas_Object *obj, void *event_info);
void test_efl_anim_repeat(void *data, Evas_Object *obj, void *event_info);
void test_efl_anim_start_delay(void *data, Evas_Object *obj, void *event_info);
@ -923,7 +922,6 @@ add_tests:
ADD_TEST_EO(NULL, "Effects", "Efl.Animation.Translate Absolute", test_efl_anim_translate_absolute);
ADD_TEST_EO(NULL, "Effects", "Efl.Animation.Group Parallel", test_efl_anim_group_parallel);
ADD_TEST_EO(NULL, "Effects", "Efl.Animation.Group Sequential", test_efl_anim_group_sequential);
ADD_TEST_EO(NULL, "Effects", "Efl.Animation.Event Animation", test_efl_anim_event_anim);
ADD_TEST_EO(NULL, "Effects", "Efl.Animation.Pause", test_efl_anim_pause);
ADD_TEST_EO(NULL, "Effects", "Efl.Animation.Repeat", test_efl_anim_repeat);
ADD_TEST_EO(NULL, "Effects", "Efl.Animation.Start Delay", test_efl_anim_start_delay);

View File

@ -1,91 +0,0 @@
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#include <Elementary.h>
typedef struct _App_Data
{
Efl_Canvas_Animation_Player *target;
Eina_Bool is_btn_visible;
} App_Data;
static void
_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
App_Data *ad = data;
ad->is_btn_visible = !(ad->is_btn_visible);
if (ad->is_btn_visible)
{
//Start animtion by showing button
evas_object_show(ad->target);
elm_object_text_set(obj, "Hide Button");
}
else
{
//Start animtion by hiding button
evas_object_hide(ad->target);
elm_object_text_set(obj, "Show Button");
}
}
static void
_win_del_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
App_Data *ad = data;
free(ad);
}
void
test_efl_anim_event_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
App_Data *ad = calloc(1, sizeof(App_Data));
if (!ad) return;
Evas_Object *win = elm_win_add(NULL, "Efl Animation Event Animation", ELM_WIN_BASIC);
elm_win_title_set(win, "Efl Animation Event Animation");
elm_win_autodel_set(win, EINA_TRUE);
evas_object_smart_callback_add(win, "delete,request", _win_del_cb, ad);
//Button to be animated
Evas_Object *btn = elm_button_add(win);
elm_object_text_set(btn, "Button");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_resize(btn, 200, 200);
evas_object_move(btn, 100, 50);
//Show Animation
Efl_Canvas_Animation *show_anim = efl_add(EFL_CANVAS_ANIMATION_ALPHA_CLASS, win);
efl_animation_alpha_set(show_anim, 0.0, 1.0);
efl_animation_duration_set(show_anim, 1.0);
efl_animation_final_state_keep_set(show_anim, EINA_TRUE);
efl_canvas_object_event_animation_set(btn, EFL_GFX_ENTITY_EVENT_SHOW, show_anim);
//Show button after setting event animation to show animation for show event
evas_object_show(btn);
//Hide Animation
Efl_Canvas_Animation *hide_anim = efl_add(EFL_CANVAS_ANIMATION_ALPHA_CLASS, win);
efl_animation_alpha_set(hide_anim, 1.0, 0.0);
efl_animation_duration_set(hide_anim, 1.0);
efl_animation_final_state_keep_set(hide_anim, EINA_TRUE);
efl_canvas_object_event_animation_set(btn, EFL_GFX_ENTITY_EVENT_HIDE, hide_anim);
//Initialize App Data
ad->target = btn;
ad->is_btn_visible = EINA_TRUE;
//Button to start animation
Evas_Object *btn2 = elm_button_add(win);
elm_object_text_set(btn2, "Hide Button");
evas_object_smart_callback_add(btn2, "clicked", _btn_clicked_cb, ad);
evas_object_size_hint_weight_set(btn2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_resize(btn2, 200, 50);
evas_object_move(btn2, 100, 300);
evas_object_show(btn2);
evas_object_resize(win, 400, 400);
evas_object_show(win);
}

View File

@ -570,20 +570,6 @@ abstract @beta Efl.Canvas.Object extends Efl.Loop_Consumer implements Efl.Gfx.En
return: bool; [[$true if the coords are inside the object, $false otherwise]]
}
}
@property event_animation {
[[Set the $animation which starts when the given $desc happens to the object.]]
get { legacy: null; }
set { legacy: null; }
keys {
@cref desc: Efl.Event_Description;
[[The event description for which the given $animation is set.]]
}
values {
animation: Efl.Canvas.Animation;
[[The animation which starts when the given $desc
happens to the object.]]
}
}
}
implements {
Efl.Object.constructor;
@ -619,9 +605,6 @@ abstract @beta Efl.Canvas.Object extends Efl.Loop_Consumer implements Efl.Gfx.En
Efl.Canvas.Pointer.pointer_inside { get; }
}
events {
anim_started: Efl.Canvas.Object_Animation_Event; [[Animation is started.]]
anim_running: Efl.Canvas.Object_Animation_Event; [[Animation is running.]]
anim_ended: Efl.Canvas.Object_Animation_Event; [[Animation is ended.]]
animator,tick: Efl.Event_Animator_Tick; [[Animator tick synchronized with screen vsync if possible.]]
}
}

View File

@ -164,115 +164,6 @@ _evas_object_pointer_data_get(Evas_Pointer_Data *evas_pdata,
return pdata;
}
static void _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj);
static void
_anim_started_cb(void *data, const Efl_Event *ev)
{
const Efl_Event_Description *desc = data;
Efl_Canvas_Object_Animation_Event event;
event.event_desc = desc;
Eo *eo_obj = efl_animation_player_target_get(ev->object);
efl_event_callback_call(eo_obj, EFL_CANVAS_OBJECT_EVENT_ANIM_STARTED,
&event);
}
static void
_anim_running_cb(void *data, const Efl_Event *ev)
{
const Efl_Event_Description *desc = data;
Efl_Canvas_Object_Animation_Event event;
event.event_desc = desc;
Eo *eo_obj = efl_animation_player_target_get(ev->object);
efl_event_callback_call(eo_obj, EFL_CANVAS_OBJECT_EVENT_ANIM_RUNNING,
&event);
}
static void
_anim_ended_cb(void *data, const Efl_Event *ev)
{
const Efl_Event_Description *desc = data;
efl_event_callback_del(ev->object, EFL_ANIMATION_PLAYER_EVENT_STARTED,
_anim_started_cb, desc);
efl_event_callback_del(ev->object, EFL_ANIMATION_PLAYER_EVENT_RUNNING,
_anim_running_cb, desc);
efl_event_callback_del(ev->object, EFL_ANIMATION_PLAYER_EVENT_ENDED,
_anim_ended_cb, desc);
Efl_Canvas_Object_Animation_Event event;
event.event_desc = desc;
Eo *eo_obj = efl_animation_player_target_get(ev->object);
efl_event_callback_call(eo_obj, EFL_CANVAS_OBJECT_EVENT_ANIM_ENDED,
&event);
if (desc == EFL_GFX_ENTITY_EVENT_HIDE)
{
Evas_Object_Protected_Data *obj = EVAS_OBJECT_DATA_SAFE_GET(eo_obj);
if (!obj) return;
_hide(eo_obj, obj);
}
}
static void
_animation_intercept_hide(void *data, Evas_Object *eo_obj)
{
Event_Animation *event_anim = data;
Evas_Object_Protected_Data *obj = EVAS_OBJECT_DATA_SAFE_GET(eo_obj);
if (!obj) return;
if (event_anim->anim && obj->anim_player &&
(event_anim->anim != efl_animation_player_animation_get(obj->anim_player)))
{
efl_animation_player_animation_set(obj->anim_player, event_anim->anim);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_STARTED,
_anim_started_cb, EFL_GFX_ENTITY_EVENT_HIDE);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_RUNNING,
_anim_running_cb, EFL_GFX_ENTITY_EVENT_HIDE);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_ENDED,
_anim_ended_cb, EFL_GFX_ENTITY_EVENT_HIDE);
//Start animation
efl_player_start(obj->anim_player);
}
}
static void
_event_anim_free(Event_Animation *event_anim, Evas_Object_Protected_Data *obj)
{
if (event_anim->anim)
{
//Unset callbacks for Hide event
if (event_anim->desc == EFL_GFX_ENTITY_EVENT_HIDE)
evas_object_intercept_hide_callback_del(obj->object,
_animation_intercept_hide);
if (efl_player_play_get(obj->anim_player))
{
Efl_Animation *running_anim =
efl_animation_player_animation_get(obj->anim_player);
if (running_anim == event_anim->anim)
efl_player_stop(obj->anim_player);
}
}
free(event_anim);
}
EOLIAN static Eo *
_efl_canvas_object_efl_object_constructor(Eo *eo_obj, Evas_Object_Protected_Data *obj)
{
@ -301,7 +192,6 @@ _efl_canvas_object_efl_object_constructor(Eo *eo_obj, Evas_Object_Protected_Data
obj->data_3d = eina_cow_alloc(evas_object_3d_cow);
obj->mask = eina_cow_alloc(evas_object_mask_cow);
obj->events = eina_cow_alloc(evas_object_events_cow);
obj->event_anims = NULL;
evas_object_inject(eo_obj, obj, evas);
evas_object_callback_init(eo_obj, obj);
@ -1122,124 +1012,6 @@ _efl_canvas_object_efl_input_interface_seat_event_filter_set(Eo *eo_obj,
}
}
static Eina_Bool
_is_event_blocked(Eo *eo_obj, const Efl_Event_Description *desc,
void *event_info)
{
if ((desc == EFL_EVENT_FOCUS_IN) ||
(desc == EFL_EVENT_FOCUS_OUT) ||
(desc == EFL_EVENT_KEY_DOWN) ||
(desc == EFL_EVENT_KEY_UP) ||
(desc == EFL_EVENT_HOLD) ||
(desc == EFL_EVENT_POINTER_IN) ||
(desc == EFL_EVENT_POINTER_OUT) ||
(desc == EFL_EVENT_POINTER_DOWN) ||
(desc == EFL_EVENT_POINTER_UP) ||
(desc == EFL_EVENT_POINTER_MOVE) ||
(desc == EFL_EVENT_POINTER_WHEEL) ||
(desc == EFL_EVENT_POINTER_CANCEL) ||
(desc == EFL_EVENT_POINTER_AXIS) ||
(desc == EFL_EVENT_FINGER_MOVE) ||
(desc == EFL_EVENT_FINGER_DOWN) ||
(desc == EFL_EVENT_FINGER_UP))
{
Efl_Input_Device *seat = efl_input_device_seat_get(efl_input_device_get(event_info));
return !efl_input_seat_event_filter_get(eo_obj, seat);
}
return EINA_FALSE;
}
static Event_Animation *
_event_animation_find(Evas_Object_Protected_Data *obj,
const Efl_Event_Description *desc)
{
Event_Animation *event_anim;
EINA_INLIST_FOREACH(obj->event_anims, event_anim)
{
if (event_anim->desc == desc)
return event_anim;
}
return NULL;
}
EOLIAN static Eina_Bool
_efl_canvas_object_efl_object_event_callback_call(Eo *eo_obj,
Evas_Object_Protected_Data *obj,
const Efl_Event_Description *desc,
void *event_info)
{
if (_is_event_blocked(eo_obj, desc, event_info)) return EINA_FALSE;
//Start animation corresponding to the current event
if (desc)
{
if ((desc != EFL_GFX_ENTITY_EVENT_HIDE) && desc != (EFL_GFX_ENTITY_EVENT_SHOW))
{
Event_Animation *event_anim = _event_animation_find(obj, desc);
if (event_anim)
{
//Create animation object to start animation
efl_animation_player_animation_set(obj->anim_player, event_anim->anim);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_STARTED,
_anim_started_cb, desc);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_RUNNING,
_anim_running_cb, desc);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_ENDED,
_anim_ended_cb, desc);
//Start animation
efl_player_start(obj->anim_player);
}
}
}
return efl_event_callback_call(efl_super(eo_obj, MY_CLASS),
desc, event_info);
}
EOLIAN static Eina_Bool
_efl_canvas_object_efl_object_event_callback_legacy_call(Eo *eo_obj,
Evas_Object_Protected_Data *obj,
const Efl_Event_Description *desc,
void *event_info)
{
if (_is_event_blocked(eo_obj, desc, event_info)) return EINA_FALSE;
//Start animation corresponding to the current event
if (desc)
{
if ((desc != EFL_GFX_ENTITY_EVENT_HIDE) && desc != (EFL_GFX_ENTITY_EVENT_SHOW))
{
Event_Animation *event_anim = _event_animation_find(obj, desc);
if (event_anim)
{
//Create animation object to start animation
efl_animation_player_animation_set(obj->anim_player, event_anim->anim);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_STARTED,
_anim_started_cb, desc);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_RUNNING,
_anim_running_cb, desc);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_ENDED,
_anim_ended_cb, desc);
//Start animation
efl_player_start(obj->anim_player);
}
}
}
return efl_event_callback_legacy_call(efl_super(eo_obj, MY_CLASS),
desc, event_info);
}
EOLIAN static void
_efl_canvas_object_efl_object_invalidate(Eo *eo_obj, Evas_Object_Protected_Data *obj)
{
@ -1251,10 +1023,6 @@ _efl_canvas_object_efl_object_invalidate(Eo *eo_obj, Evas_Object_Protected_Data
evas_object_async_block(obj);
// Unset callbacks for Hide event before hiding
evas_object_intercept_hide_callback_del((Eo *)eo_obj,
_animation_intercept_hide);
efl_gfx_entity_visible_set((Eo *) eo_obj, EINA_FALSE);
obj->efl_del_called = EINA_TRUE;
@ -1329,18 +1097,6 @@ _efl_canvas_object_efl_object_invalidate(Eo *eo_obj, Evas_Object_Protected_Data
if (obj->cur && obj->cur->clipper) evas_object_clip_unset(eo_obj);
if (obj->prev) _efl_canvas_object_clip_prev_reset(obj, EINA_FALSE);
//Free event animations
while (obj->event_anims)
{
Event_Animation *event_anim =
EINA_INLIST_CONTAINER_GET(obj->event_anims, Event_Animation);
obj->event_anims =
eina_inlist_remove(obj->event_anims, obj->event_anims);
_event_anim_free(event_anim, obj);
}
if (obj->map) evas_object_map_set(eo_obj, NULL);
if (obj->is_smart) evas_object_smart_del(eo_obj);
@ -2019,26 +1775,6 @@ _show(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
}
evas_object_update_bounding_box(eo_obj, obj, NULL);
evas_object_inform_call_show(eo_obj, obj);
Event_Animation *event_anim = _event_animation_find(obj, EFL_GFX_ENTITY_EVENT_SHOW);
if (event_anim)
{
//Create animation object to start animation
efl_animation_player_animation_set(obj->anim_player, event_anim->anim);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_STARTED,
_anim_started_cb, EFL_GFX_ENTITY_EVENT_SHOW);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_RUNNING,
_anim_running_cb, EFL_GFX_ENTITY_EVENT_SHOW);
efl_event_callback_add(obj->anim_player,
EFL_ANIMATION_PLAYER_EVENT_ENDED,
_anim_ended_cb, EFL_GFX_ENTITY_EVENT_SHOW);
//Start animation
efl_player_start(obj->anim_player);
}
}
static void
@ -2646,63 +2382,6 @@ evas_find(const Eo *obj)
return efl_provider_find(obj, EVAS_CANVAS_CLASS);
}
EOLIAN void
_efl_canvas_object_event_animation_set(Eo *eo_obj,
Evas_Object_Protected_Data *pd,
const Efl_Event_Description *desc,
Efl_Canvas_Animation *animation)
{
Event_Animation *event_anim = _event_animation_find(pd, desc);
if (!pd->anim_player)
{
pd->anim_player = efl_add(EFL_CANVAS_ANIMATION_PLAYER_CLASS, eo_obj,
efl_animation_player_target_set(efl_added, eo_obj));
}
if (event_anim)
{
if (event_anim->anim == animation)
return;
pd->event_anims =
eina_inlist_remove(pd->event_anims, EINA_INLIST_GET(event_anim));
_event_anim_free(event_anim, pd);
}
if (!animation) return;
event_anim = calloc(1, sizeof(Event_Animation));
EINA_SAFETY_ON_NULL_RETURN(event_anim);
//Set callback for Hide event
if (desc == EFL_GFX_ENTITY_EVENT_HIDE)
{
evas_object_intercept_hide_callback_add(eo_obj,
_animation_intercept_hide,
event_anim);
}
event_anim->desc = desc;
event_anim->anim = animation;
pd->event_anims =
eina_inlist_append(pd->event_anims, EINA_INLIST_GET(event_anim));
}
EOLIAN Efl_Canvas_Animation *
_efl_canvas_object_event_animation_get(const Eo *eo_obj EINA_UNUSED,
Evas_Object_Protected_Data *pd,
const Efl_Event_Description *desc)
{
Event_Animation *event_anim = _event_animation_find(pd, desc);
if (event_anim)
return event_anim->anim;
return NULL;
}
void
_efl_canvas_object_event_animation_cancel(Eo *eo_obj)
{
@ -2873,8 +2552,6 @@ EOAPI EFL_VOID_FUNC_BODYV(efl_canvas_object_type_set, EFL_FUNC_CALL(type), const
#define EFL_CANVAS_OBJECT_EXTRA_OPS \
EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _efl_canvas_object_efl_object_dbg_info_get), \
EFL_OBJECT_OP_FUNC(efl_event_callback_legacy_call, _efl_canvas_object_efl_object_event_callback_legacy_call), \
EFL_OBJECT_OP_FUNC(efl_event_callback_call, _efl_canvas_object_efl_object_event_callback_call), \
EFL_OBJECT_OP_FUNC(efl_canvas_object_legacy_ctor, _efl_canvas_object_legacy_ctor), \
EFL_OBJECT_OP_FUNC(efl_canvas_object_type_set, _efl_canvas_object_type_set)

View File

@ -1147,8 +1147,6 @@ struct _Evas_Object_Protected_Data
unsigned char no_change_render;
unsigned char delete_me;
Eina_Inlist *event_anims; //List of Efl_Animation
Eina_Bool render_pre : 1;
Eina_Bool rect_del : 1;