forked from enlightenment/efl
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:
parent
a92274f811
commit
868e3308b1
|
@ -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->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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue