efl_ui/image: implement efl.player::playback_speed methods
authorMike Blumenkrantz <zmike@samsung.com>
Tue, 24 Sep 2019 19:43:00 +0000 (15:43 -0400)
committerJongmin Lee <jm105.lee@samsung.com>
Wed, 25 Sep 2019 21:11:54 +0000 (06:11 +0900)
Reviewed-by: Cedric BAIL <cedric.bail@free.fr>
Differential Revision: https://phab.enlightenment.org/D10121

src/lib/elementary/efl_ui_image.c
src/lib/elementary/efl_ui_image.eo
src/lib/elementary/efl_ui_image_zoomable.c
src/lib/elementary/efl_ui_image_zoomable.eo
src/lib/elementary/efl_ui_image_zoomable_private.h
src/lib/elementary/efl_ui_widget_image.h

index ba71e49..16f1f73 100644 (file)
@@ -141,7 +141,7 @@ _efl_ui_image_animate_cb(void *data)
        (sd->img, sd->cur_frame, 0);
 
    if (sd->frame_duration > 0)
-     ecore_timer_interval_set(sd->anim_timer, sd->frame_duration);
+     ecore_timer_interval_set(sd->anim_timer, sd->frame_duration * sd->playback_speed);
 
    return ECORE_CALLBACK_RENEW;
 }
@@ -889,6 +889,7 @@ _efl_ui_image_efl_object_constructor(Eo *obj, Efl_Ui_Image_Data *pd)
    pd->self = obj;
    /* legacy elm_image starts paused */
    pd->paused = elm_widget_is_legacy(obj);
+   pd->playback_speed = 1;
 
    return obj;
 }
@@ -1777,7 +1778,7 @@ _efl_ui_image_animated_set_internal(Eo *obj, Efl_Ui_Image_Data *sd, Eina_Bool an
         evas_object_image_animated_frame_set(sd->img, sd->cur_frame);
         if (!sd->paused)//legacy
           sd->anim_timer = ecore_timer_add
-              (sd->frame_duration, _efl_ui_image_animate_cb, obj);
+              (sd->frame_duration * sd->playback_speed, _efl_ui_image_animate_cb, obj);
      }
    else
      {
@@ -1826,6 +1827,28 @@ _efl_ui_image_efl_player_playing_get(const Eo *obj, Efl_Ui_Image_Data *sd)
 }
 
 EOLIAN static void
+_efl_ui_image_efl_player_playback_speed_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd, double factor)
+{
+   EINA_SAFETY_ON_TRUE_RETURN(factor < 0.0);
+   EINA_SAFETY_ON_TRUE_RETURN(EINA_DBL_EQ(factor, 0.0));
+   if (EINA_DBL_EQ(sd->playback_speed, factor)) return;
+   sd->playback_speed = factor;
+   if (sd->edje)
+     efl_player_playback_speed_set(sd->img, factor);
+   else if (sd->anim_timer)
+     {
+        ecore_timer_interval_set(sd->anim_timer, sd->frame_duration * sd->playback_speed);
+        ecore_timer_reset(sd->anim_timer);
+     }
+}
+
+EOLIAN static double
+_efl_ui_image_efl_player_playback_speed_get(const Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd)
+{
+   return sd->playback_speed;
+}
+
+EOLIAN static void
 _efl_ui_image_efl_player_playback_position_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd, double sec)
 {
    EINA_SAFETY_ON_TRUE_RETURN(sec < 0.0);
@@ -1874,7 +1897,7 @@ _efl_ui_image_animated_paused_set_internal(Eo *obj, Efl_Ui_Image_Data *sd, Eina_
    if (!paused)
      {
         sd->anim_timer = ecore_timer_add
-            (sd->frame_duration, _efl_ui_image_animate_cb, obj);
+            (sd->frame_duration * sd->playback_speed, _efl_ui_image_animate_cb, obj);
      }
    else
      {
index 5d32abd..f4a8dbc 100644 (file)
@@ -102,6 +102,7 @@ class Efl.Ui.Image extends Efl.Ui.Widget implements Efl.Input.Clickable, Efl.Ui.
       Efl.Player.paused { get; set; }
       Efl.Player.playback_position { get; set; }
       Efl.Player.playback_progress { get; }
+      Efl.Player.playback_speed { get; set; }
       Efl.Layout.Signal.signal_emit;
       Efl.Layout.Signal.message_send;
       Efl.Layout.Signal.signal_callback_add;
index 00c71a0..8e8323f 100644 (file)
@@ -1951,12 +1951,13 @@ _efl_ui_image_zoomable_efl_canvas_group_group_member_add(Eo *obj, Efl_Ui_Image_Z
 }
 
 EOLIAN static Eo *
-_efl_ui_image_zoomable_efl_object_constructor(Eo *obj, Efl_Ui_Image_Zoomable_Data *_pd EINA_UNUSED)
+_efl_ui_image_zoomable_efl_object_constructor(Eo *obj, Efl_Ui_Image_Zoomable_Data *pd)
 {
    obj = efl_constructor(efl_super(obj, MY_CLASS));
    evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
    efl_access_object_role_set(obj, EFL_ACCESS_ROLE_IMAGE);
    legacy_object_focus_handle(obj);
+   pd->playback_speed = 1;
    return obj;
 }
 
@@ -3047,7 +3048,7 @@ _efl_ui_image_zoomable_animate_cb(void *data)
        (sd->img, sd->cur_frame, 0);
 
    if (sd->frame_duration > 0)
-     ecore_timer_interval_set(sd->anim_timer, sd->frame_duration);
+     ecore_timer_interval_set(sd->anim_timer, sd->frame_duration * sd->playback_speed);
 
    return ECORE_CALLBACK_RENEW;
 }
@@ -3077,7 +3078,7 @@ _efl_ui_image_zoomable_animated_set_internal(Eo *obj EINA_UNUSED, Efl_Ui_Image_Z
         evas_object_image_animated_frame_set(sd->img, sd->cur_frame);
         if (!sd->paused)//legacy
           sd->anim_timer = ecore_timer_add
-              (sd->frame_duration, _efl_ui_image_zoomable_animate_cb, obj);
+              (sd->frame_duration * sd->playback_speed, _efl_ui_image_zoomable_animate_cb, obj);
      }
    else
      {
@@ -3104,7 +3105,7 @@ _efl_ui_image_zoomable_animated_paused_set_internal(Eo *obj, Efl_Ui_Image_Zoomab
    if (!paused)
      {
         sd->anim_timer = ecore_timer_add
-            (sd->frame_duration, _efl_ui_image_zoomable_animate_cb, obj);
+            (sd->frame_duration * sd->playback_speed, _efl_ui_image_zoomable_animate_cb, obj);
      }
    else
      {
@@ -3140,6 +3141,28 @@ _efl_ui_image_zoomable_efl_player_paused_get(const Eo *obj EINA_UNUSED, Efl_Ui_I
 }
 
 EOLIAN static void
+_efl_ui_image_zoomable_efl_player_playback_speed_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd, double factor)
+{
+   EINA_SAFETY_ON_TRUE_RETURN(factor < 0.0);
+   EINA_SAFETY_ON_TRUE_RETURN(EINA_DBL_EQ(factor, 0.0));
+   if (EINA_DBL_EQ(sd->playback_speed, factor)) return;
+   sd->playback_speed = factor;
+   if (sd->edje)
+     efl_player_playback_speed_set(sd->edje, factor);
+   else if (sd->anim_timer)
+     {
+        ecore_timer_interval_set(sd->anim_timer, sd->frame_duration * sd->playback_speed);
+        ecore_timer_reset(sd->anim_timer);
+     }
+}
+
+EOLIAN static double
+_efl_ui_image_zoomable_efl_player_playback_speed_get(const Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd)
+{
+   return sd->playback_speed;
+}
+
+EOLIAN static void
 _efl_ui_image_zoomable_efl_player_playback_position_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd, double sec)
 {
    EINA_SAFETY_ON_TRUE_RETURN(sec < 0.0);
index 40dca93..945cfab 100644 (file)
@@ -48,6 +48,7 @@ class @beta Efl.Ui.Image_Zoomable extends Efl.Ui.Image implements Efl.Ui.Zoom
       Efl.Player.paused { get; set; }
       Efl.Player.playback_position { get; set; }
       Efl.Player.playback_progress { get; }
+      Efl.Player.playback_speed { get; set; }
       Efl.Ui.Zoom.zoom_animation { set; get; }
       Efl.Ui.Zoom.zoom_level { set; get; }
       Efl.Ui.Zoom.zoom_mode { set; get; }
index aaf011a..5fbafd5 100644 (file)
@@ -126,6 +126,7 @@ struct _Efl_Ui_Image_Zoomable_Data
 
    Ecore_Timer          *anim_timer;
    double                frame_duration;
+   double                playback_speed;
    int                   cur_frame;
    int                   frame_count;
 
index 3089eb8..b04c177 100644 (file)
@@ -57,6 +57,7 @@ struct _Efl_Ui_Image_Data
 
    double                scale;
    double                frame_duration;
+   double                playback_speed;
    double                align_x, align_y;
 
    Eina_Size2D           load_size;