Hello,

On 04/19/2018 04:46 PM, Jaehyun Cho wrote:
jaehyun pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=e3315baaa324a30595771e446e4d3cff6022fda6

commit e3315baaa324a30595771e446e4d3cff6022fda6
Author: Jaehyun Cho <[email protected]>
Date:   Tue Apr 10 22:09:39 2018 +0900

     efl_canvas_object: Add events for state changes of object's animation
Add events to notice the state changes of canvas object's animation.
     anim_started, anim_running, and anim_ended events are added.
---
  src/lib/evas/Evas_Eo.h                   |   5 ++
  src/lib/evas/canvas/efl_canvas_object.eo |   5 ++
  src/lib/evas/canvas/evas_object_main.c   | 133 +++++++++++++++++++++++++------
  3 files changed, 118 insertions(+), 25 deletions(-)

diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h
index 7a44a0985d..c6a6a935bb 100644
--- a/src/lib/evas/Evas_Eo.h
+++ b/src/lib/evas/Evas_Eo.h
@@ -136,6 +136,11 @@ struct _Efl_Canvas_Animation_Player_Event_Running
     double progress;
  };
+typedef struct Efl_Canvas_Object_Animation_Event_Info
+{
+   const Efl_Event_Description *event_type;
+} Efl_Canvas_Object_Animation_Event_Info;
+
  /**
   * @ingroup Evas_Object_Rectangle
   *
diff --git a/src/lib/evas/canvas/efl_canvas_object.eo 
b/src/lib/evas/canvas/efl_canvas_object.eo
index d6a97acf49..5ec948af2f 100644
--- a/src/lib/evas/canvas/efl_canvas_object.eo
+++ b/src/lib/evas/canvas/efl_canvas_object.eo
@@ -622,4 +622,9 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, 
Efl.Gfx.Color, Efl.Gfx.Stack, E
        Efl.Loop.Consumer.loop { get; }
        Efl.Canvas.Pointer.pointer_inside { get; }
     }
+   events {
+      anim_started; [[Animation is started.]]
+      anim_running; [[Animation is running.]]
+      anim_ended; [[Animation is ended.]]

Later in the code you are adding a struct as event info, but this is not encoded in the API, can this be added?

+   }
  }
diff --git a/src/lib/evas/canvas/evas_object_main.c 
b/src/lib/evas/canvas/evas_object_main.c
index af73d947ac..2005c34ef8 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -44,8 +44,7 @@ typedef struct _Event_Animation
     EINA_INLIST;
const Efl_Event_Description *desc;
-
-   Efl_Canvas_Animation               *anim;
+   Efl_Canvas_Animation        *anim;
  } Event_Animation;
static Eina_Bool
@@ -166,22 +165,63 @@ _evas_object_pointer_data_get(Evas_Pointer_Data 
*evas_pdata,
     return pdata;
  }
-static void _animation_intercept_hide(void *data, Evas_Object *eo_obj);
  static void _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj);
static void
-_animation_end_cb(void *data, const Efl_Event *event)
+_anim_started_cb(void *data, const Efl_Event *ev)
  {
-  Evas_Object_Protected_Data *obj;
-  Event_Animation *event_anim = data;
+   const Efl_Event_Description *desc = data;
- obj = EVAS_OBJECT_DATA_SAFE_GET(efl_animation_player_target_get(event->object));
-   if (!obj) return;
+   Efl_Canvas_Object_Animation_Event_Info event;
+   event.event_type = desc;
- if (efl_animation_player_animation_get(event->object) != event_anim->anim)
-     return;
+   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_Info event;
+   event.event_type = desc;
- _hide(obj->object, obj);
+   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_Info event;
+   event.event_type = 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_EVENT_HIDE)
+     {
+        Evas_Object_Protected_Data *obj = EVAS_OBJECT_DATA_SAFE_GET(eo_obj);
+        if (!obj) return;
+
+        _hide(eo_obj, obj);
+     }
  }
static void
@@ -192,9 +232,20 @@ _animation_intercept_hide(void *data, Evas_Object *eo_obj)
     if (!obj) return;
if (event_anim->anim && obj->anim_player &&
-      (event_anim->anim != 
efl_animation_player_animation_get(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_EVENT_HIDE);
+        efl_event_callback_add(obj->anim_player,
+                               EFL_ANIMATION_PLAYER_EVENT_RUNNING,
+                               _anim_running_cb, EFL_GFX_EVENT_HIDE);
+        efl_event_callback_add(obj->anim_player,
+                               EFL_ANIMATION_PLAYER_EVENT_ENDED,
+                               _anim_ended_cb, EFL_GFX_EVENT_HIDE);
+
          //Start animation
          efl_player_start(obj->anim_player);
       }
@@ -205,17 +256,18 @@ _event_anim_free(Event_Animation *event_anim, 
Evas_Object_Protected_Data *obj)
  {
     if (event_anim->anim)
       {
-        //Deallocate memory and Unset callbacks for Hide event
+        //Unset callbacks for Hide event
          if (event_anim->desc == EFL_GFX_EVENT_HIDE)
+          evas_object_intercept_hide_callback_del(obj->object,
+                                                  _animation_intercept_hide);
+
+        if (efl_player_play_get(obj->anim_player))
            {
-             evas_object_intercept_hide_callback_del(obj->object,
-                                                     
_animation_intercept_hide);
-             efl_event_callback_del(obj->anim_player,
-                                    EFL_ANIMATION_PLAYER_EVENT_ENDED,
-                                    _animation_end_cb,
-                                    event_anim);
-             if (efl_player_play_get(obj->anim_player))
-               efl_gfx_visible_set(obj->object, EINA_FALSE);
+             Efl_Animation *running_anim =
+                efl_animation_player_animation_get(obj->anim_player);
+
+             if (running_anim == event_anim->anim)
+               efl_player_stop(obj->anim_player);
            }
       }
@@ -972,6 +1024,11 @@ _efl_canvas_object_efl_object_del(const Eo *eo_obj, Evas_Object_Protected_Data *
          obj->del_ref = EINA_TRUE;
          return;
       }
+
+   //Unset callbacks for Hide event before hiding
+   evas_object_intercept_hide_callback_del((Eo *)eo_obj,
+                                           _animation_intercept_hide);
+
     efl_gfx_visible_set((Eo *) eo_obj, EINA_FALSE);
     obj->efl_del_called = EINA_TRUE;
     efl_del(efl_super(eo_obj, MY_CLASS));
@@ -1120,6 +1177,16 @@ _efl_canvas_object_efl_object_event_callback_call(Eo 
*eo_obj,
                    //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);
                 }
@@ -1149,6 +1216,16 @@ 
_efl_canvas_object_efl_object_event_callback_legacy_call(Eo *eo_obj,
                    //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);
                 }
@@ -1873,6 +1950,16 @@ _show(Evas_Object *eo_obj, Evas_Object_Protected_Data 
*obj)
          //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_EVENT_SHOW);
+        efl_event_callback_add(obj->anim_player,
+                               EFL_ANIMATION_PLAYER_EVENT_RUNNING,
+                               _anim_running_cb, EFL_GFX_EVENT_SHOW);
+        efl_event_callback_add(obj->anim_player,
+                               EFL_ANIMATION_PLAYER_EVENT_ENDED,
+                               _anim_ended_cb, EFL_GFX_EVENT_SHOW);
+
          //Start animation
          efl_player_start(obj->anim_player);
       }
@@ -2492,10 +2579,6 @@ _efl_canvas_object_event_animation_set(Eo *eo_obj,
          evas_object_intercept_hide_callback_add(eo_obj,
                                                  _animation_intercept_hide,
                                                  event_anim);
-        efl_event_callback_add(pd->anim_player,
-                               EFL_ANIMATION_PLAYER_EVENT_ENDED,
-                               _animation_end_cb,
-                               event_anim);
       }
event_anim->desc = desc;


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to