elementary image: apply lazy calculation and guarantee retained method.

Summary:
Image couldn't gurantee retained concept status.
This patch change to setting up image object on the request time,
recovering image status, removing unencessary jobs.

Reviewers: #committers

Subscribers: cedric, #committers, zmike

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D6726
This commit is contained in:
Hermet Park 2018-08-02 09:22:59 -04:00 committed by Mike Blumenkrantz
parent a92274f811
commit 868e3308b1
2 changed files with 53 additions and 53 deletions

View File

@ -76,6 +76,19 @@ _prev_img_del(Efl_Ui_Image_Data *sd)
sd->prev_img = NULL;
}
static void
_recover_status(Eo *obj, Efl_Ui_Image_Data *sd)
{
int r, g, b, a;
Evas_Object *pclip = efl_canvas_object_clip_get(obj);
if (pclip) efl_canvas_object_clip_set(sd->img, pclip);
efl_gfx_color_get(obj, &r, &g, &b, &a);
efl_gfx_color_set(sd->img, r, g, b, a);
efl_gfx_entity_visible_set(sd->img, sd->show);
}
static void
_on_image_preloaded(void *data,
Evas *e EINA_UNUSED,
@ -143,7 +156,6 @@ _img_new(Evas_Object *obj)
evas_object_image_scale_hint_set(img, EVAS_IMAGE_SCALE_HINT_STATIC);
evas_object_event_callback_add
(img, EVAS_CALLBACK_IMAGE_PRELOADED, _on_image_preloaded, sd);
evas_object_smart_member_add(img, obj);
elm_widget_sub_object_add(obj, img);
@ -170,7 +182,6 @@ _image_sizing_eval(Efl_Ui_Image_Data *sd, Evas_Object *img)
//1. Get the original image size (iw x ih)
evas_object_image_size_get(img, &iw, &ih);
iw = ((double)iw) * sd->scale;
ih = ((double)ih) * sd->scale;
@ -275,14 +286,6 @@ done:
evas_object_resize(sd->hit_rect, w, h);
}
static void
_efl_ui_image_internal_sizing_eval(Evas_Object *obj EINA_UNUSED, Efl_Ui_Image_Data *sd)
{
if (!sd->img) return;
_image_sizing_eval(sd, sd->img);
if (sd->prev_img) _image_sizing_eval(sd, sd->prev_img);
}
static inline void
_async_open_data_free(Async_Open_Data *data)
{
@ -472,27 +475,23 @@ _efl_ui_image_edje_file_set(Evas_Object *obj,
const Eina_File *f,
const char *group)
{
Evas_Object *pclip;
EFL_UI_IMAGE_DATA_GET(obj, sd);
_prev_img_del(sd);
if (!sd->edje)
{
pclip = evas_object_clip_get(sd->img);
evas_object_del(sd->img);
/* Edje object instead */
sd->img = edje_object_add(evas_object_evas_get(obj));
_recover_status(obj, sd);
sd->edje = EINA_TRUE;
evas_object_smart_member_add(sd->img, obj);
if (sd->show) evas_object_show(sd->img);
evas_object_clip_set(sd->img, pclip);
}
_async_cancel(sd);
sd->edje = EINA_TRUE;
if (!sd->async_enable)
{
if (f)
@ -572,9 +571,6 @@ _efl_ui_image_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Image_Data *priv)
evas_object_event_callback_add
(priv->hit_rect, EVAS_CALLBACK_MOUSE_UP, _on_mouse_up, obj);
/* starts as an Evas image. may switch to an Edje object */
priv->img = _img_new(obj);
priv->smooth = EINA_TRUE;
priv->fill_inside = EINA_TRUE;
priv->aspect_fixed = EINA_TRUE;
@ -586,8 +582,6 @@ _efl_ui_image_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Image_Data *priv)
priv->align_y = 0.5;
elm_widget_can_focus_set(obj, EINA_FALSE);
_efl_ui_image_sizing_eval(obj);
}
EOLIAN static void
@ -596,6 +590,7 @@ _efl_ui_image_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Image_Data *sd)
if (elm_widget_is_legacy(obj))
efl_event_callback_del(obj, EFL_GFX_ENTITY_EVENT_CHANGE_SIZE_HINTS,
_on_size_hints_changed, sd);
ecore_job_del(sd->sizing_job);
ecore_timer_del(sd->anim_timer);
evas_object_del(sd->img);
_prev_img_del(sd);
@ -657,7 +652,7 @@ _efl_ui_image_show(Eo *obj, Efl_Ui_Image_Data *sd)
efl_gfx_entity_visible_set(efl_super(obj, MY_CLASS), EINA_TRUE);
if (sd->preload_status == EFL_UI_IMAGE_PRELOADING) return;
efl_gfx_entity_visible_set(sd->img, EINA_TRUE);
if (sd->img) efl_gfx_entity_visible_set(sd->img, EINA_TRUE);
_prev_img_del(sd);
}
@ -666,7 +661,7 @@ _efl_ui_image_hide(Eo *obj, Efl_Ui_Image_Data *sd)
{
sd->show = EINA_FALSE;
efl_gfx_entity_visible_set(efl_super(obj, MY_CLASS), EINA_FALSE);
efl_gfx_entity_visible_set(sd->img, EINA_FALSE);
if (sd->img) efl_gfx_entity_visible_set(sd->img, EINA_FALSE);
_prev_img_del(sd);
}
@ -698,7 +693,7 @@ _efl_ui_image_efl_gfx_color_color_set(Eo *obj, Efl_Ui_Image_Data *sd, int r, int
efl_gfx_color_set(efl_super(obj, MY_CLASS), r, g, b, a);
evas_object_color_set(sd->hit_rect, 0, 0, 0, 0);
evas_object_color_set(sd->img, r, g, b, a);
if (sd->img) evas_object_color_set(sd->img, r, g, b, a);
if (sd->prev_img) evas_object_color_set(sd->prev_img, r, g, b, a);
}
@ -710,7 +705,7 @@ _efl_ui_image_efl_canvas_object_clip_set(Eo *obj, Efl_Ui_Image_Data *sd, Evas_Ob
efl_canvas_object_clip_set(efl_super(obj, MY_CLASS), clip);
evas_object_clip_set(sd->img, clip);
if (sd->img) evas_object_clip_set(sd->img, clip);
if (sd->prev_img) evas_object_clip_set(sd->prev_img, clip);
}
@ -737,31 +732,23 @@ _key_action_activate(Evas_Object *obj, const char *params EINA_UNUSED)
return EINA_TRUE;
}
// TODO: remove this function after using the widget's scale value instead of image's scale value,
static void
_efl_ui_image_internal_scale_set(Evas_Object *obj, Efl_Ui_Image_Data *sd, double scale)
{
sd->scale = scale;
_efl_ui_image_internal_sizing_eval(obj, sd);
}
void
_efl_ui_image_sizing_eval(Evas_Object *obj)
_sizing_eval_cb(void *data)
{
Evas_Object *obj = data;
Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
Eina_Size2D sz;
double ts;
EFL_UI_IMAGE_DATA_GET_OR_RETURN(obj, sd);
_efl_ui_image_internal_sizing_eval(obj, sd);
efl_gfx_image_smooth_scale_set(obj, sd->smooth);
sd->sizing_job = NULL;
// TODO: remove this function after using the widget's scale value instead of image's scale value,
if (sd->no_scale)
_efl_ui_image_internal_scale_set(obj, sd, 1.0);
sd->scale = 1.0;
else
_efl_ui_image_internal_scale_set(obj, sd, efl_gfx_entity_scale_get(obj) * elm_config_scale_get());
sd->scale = efl_gfx_entity_scale_get(obj) * elm_config_scale_get();
ts = sd->scale;
sd->scale = 1.0;
@ -801,6 +788,21 @@ _efl_ui_image_sizing_eval(Evas_Object *obj)
evas_object_size_hint_min_set(obj, minw, minh);
evas_object_size_hint_max_set(obj, maxw, maxh);
if (sd->img)
{
_image_sizing_eval(sd, sd->img);
if (sd->prev_img) _image_sizing_eval(sd, sd->prev_img);
}
}
void
_efl_ui_image_sizing_eval(Evas_Object *obj)
{
EFL_UI_IMAGE_DATA_GET_OR_RETURN(obj, sd);
if (sd->sizing_job) ecore_job_del(sd->sizing_job);
sd->sizing_job = ecore_job_add(_sizing_eval_cb, obj);
}
static void
@ -816,25 +818,17 @@ _efl_ui_image_load_size_set_internal(Evas_Object *obj, Efl_Ui_Image_Data *sd)
static void
_efl_ui_image_file_set_do(Evas_Object *obj)
{
Evas_Object *pclip = NULL;
EFL_UI_IMAGE_DATA_GET(obj, sd);
ELM_SAFE_FREE(sd->prev_img, evas_object_del);
if (sd->img)
{
pclip = evas_object_clip_get(sd->img);
sd->prev_img = sd->img;
}
sd->prev_img = sd->img;
sd->img = _img_new(obj);
evas_object_image_load_orientation_set(sd->img, EINA_TRUE);
evas_object_clip_set(sd->img, pclip);
_recover_status(obj, sd);
sd->edje = EINA_FALSE;
evas_object_image_smooth_scale_set(sd->img, sd->smooth);
evas_object_image_load_orientation_set(sd->img, EINA_TRUE);
_efl_ui_image_load_size_set_internal(obj, sd);
}
@ -1242,7 +1236,11 @@ _efl_ui_image_efl_gfx_view_view_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_Image
{
int tw, th;
if (efl_isa(sd->img, EFL_CANVAS_LAYOUT_CLASS))
if (!sd->img)
{
tw = 0; th = 0;
}
else if (efl_isa(sd->img, EFL_CANVAS_LAYOUT_CLASS))
edje_object_size_min_get(sd->img, &tw, &th);
else
evas_object_image_size_get(sd->img, &tw, &th);
@ -1253,7 +1251,7 @@ _efl_ui_image_efl_gfx_view_view_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_Image
EOLIAN static Eina_Size2D
_efl_ui_image_efl_gfx_image_image_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd)
{
if (sd->edje)
if (!sd->img || sd->edje)
return EINA_SIZE2D(0, 0);
return efl_gfx_image_size_get(sd->img);

View File

@ -92,6 +92,8 @@ struct _Efl_Ui_Image_Data
Eina_Bool use : 1;
} freedesktop;
Ecore_Job *sizing_job;
Eina_Bool aspect_fixed : 1;
Eina_Bool fill_inside : 1;
Eina_Bool no_scale : 1;