diff options
author | Amitesh Singh <amitesh.sh@samsung.com> | 2017-07-06 16:14:06 +0900 |
---|---|---|
committer | Amitesh Singh <amitesh.sh@samsung.com> | 2017-07-07 09:37:51 +0900 |
commit | 0f9eb1f9614f916f2ead314d4c00210ef1ac9916 (patch) | |
tree | 4d908b9c3564c9a139640727367d578ceba3d1d8 | |
parent | 2b9d051fd275bbd3d6c55d76a714ddb5705e7c6a (diff) | |
download | efl-0f9eb1f9614f916f2ead314d4c00210ef1ac9916.tar.gz |
efl.ui.image: fix the old align behaviour in img.
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
-rw-r--r-- | src/lib/elementary/efl_ui_image.c | 38 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_widget_image.h | 1 |
2 files changed, 34 insertions, 5 deletions
diff --git a/src/lib/elementary/efl_ui_image.c b/src/lib/elementary/efl_ui_image.c index 2417c173f7..df6b7c36cd 100644 --- a/src/lib/elementary/efl_ui_image.c +++ b/src/lib/elementary/efl_ui_image.c @@ -38,6 +38,7 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = { static Eina_Bool _key_action_activate(Evas_Object *obj, const char *params); static Eina_Bool _efl_ui_image_smart_internal_file_set(Eo *obj, Efl_Ui_Image_Data *sd, const char *file, const Eina_File *f, const char *key); +static void _on_size_hints_changed(void *data, const Efl_Event *e); static const Elm_Action key_actions[] = { {"activate", _key_action_activate}, @@ -122,7 +123,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; @@ -137,7 +138,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) @@ -197,8 +198,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; @@ -612,6 +625,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); evas_object_del(sd->prev_img); @@ -865,11 +881,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 = eo_add(MY_CLASS, parent); + 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; } @@ -1452,6 +1479,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) diff --git a/src/lib/elementary/efl_ui_widget_image.h b/src/lib/elementary/efl_ui_widget_image.h index 64f7b9715c..c78bd12ba1 100644 --- a/src/lib/elementary/efl_ui_widget_image.h +++ b/src/lib/elementary/efl_ui_widget_image.h @@ -98,6 +98,7 @@ struct _Efl_Ui_Image_Data Eina_Bool async_failed : 1; Eina_Bool scale_up : 1; Eina_Bool scale_down : 1; + Eina_Bool legacy_align : 1; }; /** |