Efl.Ui.Image.Zoomable: implement efl.play.get/set
authorAmitesh Singh <amitesh.sh@samsung.com>
Wed, 7 Jun 2017 06:54:42 +0000 (15:54 +0900)
committerAmitesh Singh <amitesh.sh@samsung.com>
Thu, 8 Jun 2017 08:39:45 +0000 (17:39 +0900)
ref T5352

src/bin/elementary/test.c
src/bin/elementary/test_photocam.c
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

index 477cc58..5ce8de7 100644 (file)
@@ -181,6 +181,7 @@ void test_index_horizontal(void *data, Evas_Object *obj, void *event_info);
 void test_photocam(void *data, Evas_Object *obj, void *event_info);
 void test_photocam_remote(void *data, Evas_Object *obj, void *event_info);
 void test_photocam_icon(void *data, Evas_Object *obj, void *event_info);
+void test_photocam_animated(void *data, Evas_Object *obj, void *event_info);
 void test_photo(void *data, Evas_Object *obj, void *event_info);
 void test_prefs(void *data, Evas_Object *obj, void *event_info);
 void test_thumb(void *data, Evas_Object *obj, void *event_info);
@@ -679,6 +680,7 @@ add_tests:
    ADD_TEST(NULL, "Images", "Photocam", test_photocam);
    ADD_TEST(NULL, "Images", "Photocam Remote", test_photocam_remote);
    ADD_TEST(NULL, "Images", "Photocam Icon", test_photocam_icon);
+   ADD_TEST(NULL, "Images", "Image Zoomable animation", test_photocam_animated);
    ADD_TEST(NULL, "Images", "Photo", test_photo);
    ADD_TEST(NULL, "Images", "Thumb", test_thumb);
    ADD_TEST(NULL, "Images", "Image", test_image);
index df586da..5804384 100644 (file)
@@ -731,3 +731,58 @@ test_photocam_icon(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e
    evas_object_resize(win, 150, 150);
    evas_object_show(win);
 }
+
+static void
+_btn_clicked_cb(void *data , Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Evas_Object *zoomable = data;
+   Eina_Bool play = EINA_FALSE;
+
+   play = !efl_player_play_get(zoomable);
+   printf("image clicked! play = %d\n", play);
+   efl_player_play_set(zoomable, play);
+}
+
+void
+test_photocam_animated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Evas_Object *win, *bx, *lbl, *zoomable, *btn;
+   char buf[PATH_MAX];
+
+   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+
+   win = elm_win_util_standard_add("ImageZoomable", "Image Zoomable animation");
+   elm_win_autodel_set(win, EINA_TRUE);
+
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bx);
+   evas_object_show(bx);
+
+   lbl = elm_label_add(bx);
+   elm_object_text_set(lbl, "Clicking the button will play/pause animation.");
+   elm_box_pack_end(bx, lbl);
+   evas_object_show(lbl);
+
+   zoomable = efl_add(EFL_UI_IMAGE_ZOOMABLE_CLASS, win);
+   snprintf(buf, sizeof(buf), "%s/images/animated_logo.gif", elm_app_data_dir_get());
+   efl_file_set(zoomable, buf, NULL);
+   if (efl_player_playable_get(zoomable))
+     {
+        printf("animation is available for this image.\n");
+        efl_player_play_set(zoomable, EINA_TRUE);
+     }
+   evas_object_size_hint_weight_set(zoomable, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_fill_set(zoomable, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, zoomable);
+   evas_object_show(zoomable);
+
+   btn = efl_add(EFL_UI_BUTTON_CLASS, bx);
+   efl_text_set(btn, "start/stop");
+   evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, zoomable);
+   elm_box_pack_end(bx, btn);
+   evas_object_show(btn);
+
+   evas_object_resize(win, 320, 320);
+   evas_object_show(win);
+}
index 3488bb0..13a3b28 100644 (file)
@@ -699,7 +699,6 @@ _main_img_preloaded_cb(void *data,
 
    ELM_PHOTOCAM_DATA_GET(data, sd);
    ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
-
    evas_object_show(sd->img);
    sd->main_load_pending = 0;
    g = _grid_create(obj);
@@ -1496,6 +1495,7 @@ _efl_ui_image_zoomable_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Image_Zoomable
 {
    Efl_Ui_Image_Zoomable_Grid *g;
 
+   ecore_timer_del(sd->anim_timer);
    ELM_SAFE_FREE(sd->icon_edje, evas_object_del);
 
    EINA_LIST_FREE(sd->grids, g)
@@ -2624,6 +2624,115 @@ _efl_ui_image_zoomable_efl_player_playable_get(Eo *obj EINA_UNUSED, Efl_Ui_Image
    return evas_object_image_animated_get(sd->img);
 }
 
+static Eina_Bool
+_efl_ui_image_zoomable_animated_get_internal(const Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd)
+{
+   if (sd->icon_edje)
+     return edje_object_animation_get(sd->icon_edje);
+   return sd->anim;
+}
+
+static void
+_efl_ui_image_zoomable_animated_set_internal(Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd, Eina_Bool anim)
+{
+   anim = !!anim;
+   if (sd->anim == anim) return;
+
+   sd->anim = anim;
+
+   if (sd->icon_edje)
+     {
+        edje_object_animation_set(sd->icon_edje, anim);
+        return;
+     }
+
+   if (!evas_object_image_animated_get(sd->img)) return;
+
+   if (anim)
+     {
+        sd->frame_count = evas_object_image_animated_frame_count_get(sd->img);
+        sd->cur_frame = 1;
+        sd->frame_duration =
+          evas_object_image_animated_frame_duration_get
+            (sd->img, sd->cur_frame, 0);
+        evas_object_image_animated_frame_set(sd->img, sd->cur_frame);
+     }
+   else
+     {
+        sd->frame_count = -1;
+        sd->cur_frame = -1;
+        sd->frame_duration = -1;
+     }
+}
+
+static Eina_Bool
+_efl_ui_image_zoomable_animate_cb(void *data)
+{
+   ELM_PHOTOCAM_DATA_GET(data, sd);
+   _grid_clear_all(data);
+
+   if (!sd->anim) return ECORE_CALLBACK_CANCEL;
+
+   sd->cur_frame++;
+   if ((sd->frame_count > 0) && (sd->cur_frame > sd->frame_count))
+     sd->cur_frame = sd->cur_frame % sd->frame_count;
+
+   evas_object_image_animated_frame_set(sd->img, sd->cur_frame);
+   sd->frame_duration = evas_object_image_animated_frame_duration_get
+       (sd->img, sd->cur_frame, 0);
+
+   if (sd->frame_duration > 0)
+     ecore_timer_interval_set(sd->anim_timer, sd->frame_duration);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_efl_ui_image_zoomable_animated_play_set_internal(Eo *obj, Efl_Ui_Image_Zoomable_Data *sd, Eina_Bool play)
+{
+   if (!sd->anim) return;
+   if (sd->play == play) return;
+   sd->play = play;
+   if (sd->icon_edje)
+     {
+        edje_object_play_set(sd->icon_edje, play);
+        return;
+     }
+   if (play)
+     {
+        sd->anim_timer = ecore_timer_add
+            (sd->frame_duration, _efl_ui_image_zoomable_animate_cb, obj);
+     }
+   else
+     {
+        ELM_SAFE_FREE(sd->anim_timer, ecore_timer_del);
+     }
+}
+
+EOLIAN static void
+_efl_ui_image_zoomable_efl_player_play_set(Eo *obj, Efl_Ui_Image_Zoomable_Data *sd, Eina_Bool play)
+{
+   evas_object_image_preload(sd->img, EINA_FALSE);
+   if (play && !_efl_ui_image_zoomable_animated_get_internal(obj, sd))
+     _efl_ui_image_zoomable_animated_set_internal(obj, sd, play);
+
+   _efl_ui_image_zoomable_animated_play_set_internal(obj, sd, play);
+}
+
+static Eina_Bool
+_efl_ui_image_zoomable_animated_play_get_internal(const Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd)
+{
+   if (sd->icon_edje)
+     return edje_object_play_get(sd->icon_edje);
+   return sd->play;
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_image_zoomable_efl_player_play_get(Eo *obj, Efl_Ui_Image_Zoomable_Data *sd)
+{
+   return _efl_ui_image_zoomable_animated_play_get_internal(obj, sd);
+}
+
 EOLIAN static void
 _efl_ui_image_zoomable_class_constructor(Efl_Class *klass)
 {
index 0d50295..32eb37b 100644 (file)
@@ -53,6 +53,7 @@ class Efl.Ui.Image.Zoomable (Efl.Ui.Image, Efl.Ui.Zoom,
       Efl.Image.image_size { get; }
       Efl.Ui.Image.icon { set; get; }
       Efl.Player.playable { get; }
+      Efl.Player.play { get; set; }
       Efl.Ui.Zoom.zoom_animation { set; get; }
       Efl.Ui.Zoom.zoom { set; get; }
       Efl.Ui.Zoom.zoom_mode { set; get; }
index 26c789f..176d204 100644 (file)
@@ -127,6 +127,11 @@ struct _Efl_Ui_Image_Zoomable_Data
       Eina_Bool use : 1;
    } freedesktop;
 
+   Ecore_Timer          *anim_timer;
+   double                frame_duration;
+   int                   cur_frame;
+   int                   frame_count;
+
    Eina_List   *grids;
    Efl_Orient   orient;
    Efl_Flip     flip;
@@ -140,6 +145,8 @@ struct _Efl_Ui_Image_Zoomable_Data
    Eina_Bool    on_hold : 1;
    Eina_Bool    paused : 1;
    Eina_Bool    orientation_changed : 1;
+   Eina_Bool    play : 1;
+   Eina_Bool    anim : 1;
 };
 
 struct _Efl_Ui_Image_Zoomable_Pan_Data