efl.ui.image: fix the old align behaviour in img.
authorAmitesh Singh <amitesh.sh@samsung.com>
Thu, 6 Jul 2017 07:14:06 +0000 (16:14 +0900)
committerAmitesh Singh <amitesh.sh@samsung.com>
Thu, 6 Jul 2017 09:35:06 +0000 (18:35 +0900)
After ab23a5309490d726fe, evas_object_size_hint_align_set()
has stopped working on elm img and that patch was perfectly right
to do so but we don't change the old behaviour.
This patch is an effort to make evas_object_size_hint_align_set()
to work with elm img again.
make sure not to mix both eo apis and legacy apis.

Thanks to dave for reporting and jpeg to show the right fix.

fixes T4635

src/lib/elementary/efl_ui_image.c
src/lib/elementary/efl_ui_widget_image.h

index b4e4a0a..a9f07bb 100644 (file)
@@ -49,6 +49,7 @@ static Eina_Bool _efl_ui_image_smart_internal_file_set(Eo *obj, Efl_Ui_Image_Dat
 static void _efl_ui_image_remote_copier_cancel(Eo *obj, Efl_Ui_Image_Data *sd);
 void _efl_ui_image_sizing_eval(Evas_Object *obj);
 static void _efl_ui_image_model_properties_changed_cb(void *data, const Efl_Event *event);
+static void _on_size_hints_changed(void *data, const Efl_Event *e);
 
 static const Elm_Action key_actions[] = {
    {"activate", _key_action_activate},
@@ -149,7 +150,7 @@ _img_new(Evas_Object *obj)
 }
 
 static void
-_efl_ui_image_internal_sizing_eval(Evas_Object *obj EINA_UNUSED, Efl_Ui_Image_Data *sd)
+_efl_ui_image_internal_sizing_eval(Evas_Object *obj, Efl_Ui_Image_Data *sd)
 {
    if (!sd->img) return;
 
@@ -164,7 +165,7 @@ _efl_ui_image_internal_sizing_eval(Evas_Object *obj EINA_UNUSED, Efl_Ui_Image_Da
    else
      {
         Evas_Coord x = 0, y = 0, w = 1, h = 1;
-
+        double alignh = 0.5, alignv = 0.5;
         int iw = 0, ih = 0, offset_x = 0, offset_y = 0;
 
         //1. Get the original image size (iw x ih)
@@ -224,8 +225,20 @@ _efl_ui_image_internal_sizing_eval(Evas_Object *obj EINA_UNUSED, Efl_Ui_Image_Da
           }
 
         //3. Calculate offset according to align value
-        offset_x = ((sd->img_w - w) * sd->align_x);
-        offset_y = ((sd->img_h - h) * sd->align_y);
+        if (!sd->legacy_align)
+          {
+             offset_x = ((sd->img_w - w) * sd->align_x);
+             offset_y = ((sd->img_h - h) * sd->align_y);
+          }
+        else
+          {
+             evas_object_size_hint_align_get(obj, &alignh, &alignv);
+             if (EINA_DBL_EQ(alignh, EVAS_HINT_FILL)) alignh = 0.5;
+             if (EINA_DBL_EQ(alignv, EVAS_HINT_FILL)) alignv = 0.5;
+
+             offset_x = ((sd->img_w - w) * alignh);
+             offset_y = ((sd->img_h - h) * alignv);
+          }
 
         x = sd->img_x + offset_x;
         y = sd->img_y + offset_y;
@@ -564,6 +577,9 @@ _efl_ui_image_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Image_Data *priv)
 EOLIAN static void
 _efl_ui_image_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Image_Data *sd)
 {
+   if (sd->legacy_align)
+     efl_event_callback_del(obj, EFL_GFX_EVENT_CHANGE_SIZE_HINTS,
+                            _on_size_hints_changed, sd);
    ecore_timer_del(sd->anim_timer);
    evas_object_del(sd->img);
    _prev_img_del(sd);
@@ -825,11 +841,22 @@ _efl_ui_image_file_set_do(Evas_Object *obj)
      }
 }
 
+static void
+_on_size_hints_changed(void *data, const Efl_Event *ev)
+{
+   _efl_ui_image_internal_sizing_eval(ev->object, data);
+}
+
 EAPI Evas_Object *
 elm_image_add(Evas_Object *parent)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
    Evas_Object *obj = efl_add(MY_CLASS, parent);
+   EFL_UI_IMAGE_DATA_GET(obj, priv);
+
+   priv->legacy_align = EINA_TRUE;
+   efl_event_callback_add(obj, EFL_GFX_EVENT_CHANGE_SIZE_HINTS, _on_size_hints_changed, priv);
+
    return obj;
 }
 
@@ -1531,6 +1558,7 @@ _efl_ui_image_scalable_get(Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd, Eina_Bool
 EOLIAN static void
 _efl_ui_image_align_set(Eo *obj, Efl_Ui_Image_Data *sd, double align_x, double align_y)
 {
+   sd->legacy_align = EINA_FALSE;
    if (align_x > 1.0)
      align_x = 1.0;
    else if (align_x < 0.0)
index 92cf185..4c91f8f 100644 (file)
@@ -103,6 +103,7 @@ struct _Efl_Ui_Image_Data
    Eina_Bool             scale_up : 1;
    Eina_Bool             scale_down : 1;
    Eina_Bool             con_icon : 1;
+   Eina_Bool             legacy_align : 1;
 };
 
 /**