evas: Implement scale API in proper EO fashion

This removes the internal function pointer for scale_update. This makes
all relevant classes implement the scale API in EO.

This removes the duplicate function in Efl.Canvas.Object and only uses
the one from Efl.Ui.Base interface.

This *seems* to be working as expected. Fingers crossed!

PS: I don't like the name Efl.Ui.Base. It's an interface for a few
common API's between Gfx, Canvas and UI levels... Maybe scale simply
doesn't belong there.
This commit is contained in:
Jean-Philippe Andre 2017-11-29 17:59:34 +09:00
parent 73e3a82bc2
commit 8803040484
19 changed files with 90 additions and 81 deletions

View File

@ -453,7 +453,7 @@ test_gfx_filters(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve
o = text = evas_object_text_add(evas_object_evas_get(win));
efl_event_callback_add(o, EFL_GFX_EVENT_RESIZE, _text_resize, NULL);
efl_text_properties_font_set(o, "Sans:style=Bold", default_font_size);
efl_canvas_object_scale_set(text, elm_config_scale_get());
efl_ui_scale_set(text, elm_config_scale_get());
efl_text_set(o, "EFL");
efl_gfx_visible_set(o, 1);
efl_pack(box2, o);
@ -492,7 +492,7 @@ test_gfx_filters(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve
efl_gfx_filter_data_set(o, prg_data[k].name, prg_data[k].value, prg_data[k].exec);
evas_object_textblock_style_set(o, st);
evas_object_textblock_text_markup_set(o, tbtxt);
efl_canvas_object_scale_set(o, elm_config_scale_get());
efl_ui_scale_set(o, elm_config_scale_get());
efl_pack(box2, o);
evas_object_resize(o, 1, 1);
}

View File

@ -336,7 +336,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) efl_text_properties_font_source_set(ep->object, ed->path);
else efl_text_properties_font_source_set(ep->object, NULL);
if (ep->part->scale) efl_canvas_object_scale_set(ep->object, TO_DOUBLE(sc));
if (ep->part->scale) efl_ui_scale_set(ep->object, TO_DOUBLE(sc));
efl_text_set(ep->object, text);
/* the fit shoult not depend on font size, because it give the differet
@ -366,7 +366,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) efl_text_properties_font_source_set(ep->object, ed->path);
else efl_text_properties_font_source_set(ep->object, NULL);
if (ep->part->scale) efl_canvas_object_scale_set(ep->object, TO_DOUBLE(sc));
if (ep->part->scale) efl_ui_scale_set(ep->object, TO_DOUBLE(sc));
efl_text_properties_font_set(ep->object, font, size);
efl_text_set(ep->object, text);
@ -389,7 +389,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) efl_text_properties_font_source_set(ep->object, ed->path);
else efl_text_properties_font_source_set(ep->object, NULL);
if (ep->part->scale) efl_canvas_object_scale_set(ep->object, TO_DOUBLE(sc));
if (ep->part->scale) efl_ui_scale_set(ep->object, TO_DOUBLE(sc));
efl_text_properties_font_set(ep->object, font, size);
part_get_geometry(ep, &tw, &th);
@ -401,7 +401,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
{
int current;
if (ep->part->scale) efl_canvas_object_scale_set(ep->object, TO_DOUBLE(sc));
if (ep->part->scale) efl_ui_scale_set(ep->object, TO_DOUBLE(sc));
efl_text_properties_font_set(ep->object, font, 10);
part_get_geometry(ep, &tw, &th);
@ -423,7 +423,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
{
current = (top + bottom) / 2;
if (ep->part->scale) efl_canvas_object_scale_set(ep->object, TO_DOUBLE(sc));
if (ep->part->scale) efl_ui_scale_set(ep->object, TO_DOUBLE(sc));
efl_text_properties_font_set(ep->object, font, current);
part_get_geometry(ep, &tw, &th);
@ -439,7 +439,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
{
current++;
if (ep->part->scale) efl_canvas_object_scale_set(ep->object, TO_DOUBLE(sc));
if (ep->part->scale) efl_ui_scale_set(ep->object, TO_DOUBLE(sc));
efl_text_properties_font_set(ep->object, font, current);
part_get_geometry(ep, &tw, &th);
@ -488,7 +488,7 @@ arrange_text:
if (inlined_font) efl_text_properties_font_source_set(ep->object, ed->path);
else efl_text_properties_font_source_set(ep->object, NULL);
if (ep->part->scale) efl_canvas_object_scale_set(ep->object, TO_DOUBLE(sc));
if (ep->part->scale) efl_ui_scale_set(ep->object, TO_DOUBLE(sc));
efl_text_properties_font_set(ep->object, font, size);
efl_text_set(ep->object, text);

View File

@ -458,7 +458,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
double s = base_s;
if (ep->part->scale) base_s = TO_DOUBLE(sc);
efl_canvas_object_scale_set(ep->object, base_s);
efl_ui_scale_set(ep->object, base_s);
efl_canvas_text_size_native_get(ep->object, &tw, &th);
orig_s = base_s;
@ -467,7 +467,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
{
orig_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s,
orig_s * TO_INT(params->eval.w) / tw);
efl_canvas_object_scale_set(ep->object, orig_s);
efl_ui_scale_set(ep->object, orig_s);
efl_canvas_text_size_native_get(ep->object, &tw, &th);
}
if (chosen_desc->text.fit_x)
@ -476,7 +476,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
{
s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s,
orig_s * TO_INT(params->eval.w) / tw);
efl_canvas_object_scale_set(ep->object, s);
efl_ui_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, NULL, NULL);
}
}
@ -493,7 +493,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
s = tmp_s;
}
efl_canvas_object_scale_set(ep->object, s);
efl_ui_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, NULL, NULL);
}
}
@ -518,7 +518,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
break;
s = tmp_s;
efl_canvas_object_scale_set(ep->object, s);
efl_ui_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, &fw, &fh);
i--;
}

View File

@ -2181,6 +2181,36 @@ EAPI Evas_Render_Op evas_object_render_op_get(const Evas_Object *obj);
*/
EAPI Eina_Bool evas_object_static_clip_get(const Evas_Object *obj);
/**
* @brief Sets the scaling factor for an Evas object. Does not affect all
* objects.
*
* This will multiply the object's dimension by the given factor, thus altering
* its geometry (width and height). Useful when you want scalable UI elements,
* possibly at run time.
*
* @note Only text and textblock objects have scaling change handlers. Other
* objects won't change visually on this call.
*
* @param[in] obj The object.
* @param[in] scale The scaling factor. 1.0 means no scaling, default size.
*
* @ingroup Evas_Object
*/
EAPI void evas_object_scale_set(Evas_Object *obj, double scale);
/**
* @brief Retrieves the scaling factor for the given Evas object.
*
* @param[in] obj The object.
*
* @return The scaling factor. 1.0 means no scaling, default size.
*
* @ingroup Evas_Object
*/
EAPI double evas_object_scale_get(const Evas_Object *obj);
#include "canvas/efl_canvas_object.eo.legacy.h"
/**

View File

@ -3,7 +3,7 @@ import efl_animation_types;
abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
Efl.Input.Interface, Efl.Gfx.Size.Hint,
Efl.Gfx.Map, Efl.Loop_User)
Efl.Gfx.Map, Efl.Loop_User, Efl.Ui.Base)
{
[[Efl canvas object abstract class]]
legacy_prefix: evas_object;
@ -229,27 +229,6 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
not ($false).]]
}
}
@property scale {
set {
[[Sets the scaling factor for an Evas object. Does not affect
all objects.
This will multiply the object's dimension by the given factor,
thus altering its geometry (width and height). Useful when
you want scalable UI elements, possibly at run time.
Note: Only text and textblock objects have scaling change
handlers. Other objects won't change visually on this call.
]]
}
get {
[[Retrieves the scaling factor for the given Evas object.]]
}
values {
scale: double; [[The scaling factor. 1.0 means no scaling,
default size.]]
}
}
@property key_focus {
[[Indicates that this object is the keyboard event receiver on
its canvas.
@ -703,6 +682,7 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
Efl.Gfx.Size.Hint.hint_max { get; set; }
Efl.Gfx.Size.Hint.hint_margin { get; set; }
Efl.Gfx.Size.Hint.hint_weight { get; set; }
Efl.Ui.Base.scale { get; set; }
Efl.Input.Interface.seat_event_filter { get; set; }
Efl.Loop_User.loop { get; }
}

View File

@ -3,8 +3,9 @@ import efl_text_types;
struct Efl.Canvas.Text.Style; [[EFL text style data structure]]
class Efl.Canvas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties,
Efl.Canvas.Filter.Internal, Efl.Text.Font, Efl.Text.Style, Efl.Text.Format,
Efl.Text.Cursor, Efl.Text.Annotate, Efl.Text.Markup)
Efl.Canvas.Filter.Internal, Efl.Text.Font,
Efl.Text.Style, Efl.Text.Format, Efl.Text.Cursor,
Efl.Text.Annotate, Efl.Text.Markup, Efl.Ui.Base)
{
[[Efl canvas text class]]
legacy_prefix: evas_object_textblock;
@ -350,6 +351,7 @@ Efl.Text.Cursor, Efl.Text.Annotate, Efl.Text.Markup)
Efl.Text.Annotate.cursor_object_item_insert;
Efl.Text.Markup.markup { set; get; }
Efl.Text.Markup.cursor_markup_insert;
Efl.Ui.Base.scale { set; }
}
events {
cursor,changed; [[Called when cursor changed]]

View File

@ -57,7 +57,6 @@ static const Evas_Object_Func object_func =
NULL,
NULL,
NULL,
NULL,
NULL, // render_prepare
NULL
};

View File

@ -75,7 +75,6 @@ static const Evas_Object_Func object_func =
evas_object_image_is_inside,
NULL,
NULL,
NULL,
evas_object_image_has_opaque_rect,
evas_object_image_get_opaque_rect,
evas_object_image_can_map,

View File

@ -84,7 +84,6 @@ static const Evas_Object_Func object_func =
NULL,
NULL,
NULL,
NULL,
NULL, // render_prepare
NULL
};

View File

@ -2218,7 +2218,7 @@ _efl_canvas_object_anti_alias_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_
}
EOLIAN static void
_efl_canvas_object_scale_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, double scale)
_efl_canvas_object_efl_ui_base_scale_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, double scale)
{
if (obj->delete_me) return;
if (EINA_DBL_EQ(obj->cur->scale, scale)) return;
@ -2229,13 +2229,11 @@ _efl_canvas_object_scale_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, double
state_write->scale = scale;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_change(eo_obj, obj);
if (obj->func->scale_update) obj->func->scale_update(eo_obj, obj, obj->private_data);
}
EOLIAN static double
_efl_canvas_object_scale_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
_efl_canvas_object_efl_ui_base_scale_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
{
if (obj->delete_me) return 1.0;
return obj->cur->scale;
@ -2309,7 +2307,7 @@ _efl_canvas_object_efl_object_dbg_info_get(Eo *eo_obj, Evas_Object_Protected_Dat
layer = efl_gfx_stack_layer_get(eo_obj);
name = efl_name_get(eo_obj); // evas_object_name_get(eo_obj);
geom = efl_gfx_geometry_get(eo_obj);
scale = efl_canvas_object_scale_get(eo_obj);
scale = efl_ui_scale_get(eo_obj);
min = efl_gfx_size_hint_restricted_min_get(eo_obj);
max = efl_gfx_size_hint_max_get(eo_obj);
//efl_gfx_size_hint_request_get(eo_obj, &requestw, &requesth);
@ -2970,6 +2968,18 @@ evas_object_evas_get(const Eo *eo_obj)
return efl_provider_find((Eo *) eo_obj, EVAS_CANVAS_CLASS);
}
EAPI void
evas_object_scale_set(Evas_Object *obj, double scale)
{
efl_ui_scale_set(obj, scale);
}
EAPI double
evas_object_scale_get(const Evas_Object *obj)
{
return efl_ui_scale_get(obj);
}
/* Internal EO APIs and hidden overrides */
EOAPI EFL_VOID_FUNC_BODY(efl_canvas_object_legacy_ctor)

View File

@ -74,7 +74,6 @@ static const Evas_Object_Func object_func =
NULL,
NULL,
NULL,
NULL,
NULL, // render_prepare
NULL
};

View File

@ -82,7 +82,6 @@ static const Evas_Object_Func object_func =
NULL,
NULL,
NULL,
NULL,
NULL, // render_prepare
evas_object_rectangle_render2_walk
};

View File

@ -120,7 +120,6 @@ static const Evas_Object_Func object_func =
NULL,
NULL,
NULL,
NULL,
NULL, // render_prepare
NULL
};

View File

@ -114,9 +114,6 @@ static int evas_object_text_was_opaque(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
static void evas_object_text_scale_update(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
static void _evas_object_text_recalc(Evas_Object *eo_obj, Eina_Unicode *text);
static const Evas_Object_Func object_func =
@ -139,7 +136,6 @@ static const Evas_Object_Func object_func =
NULL,
NULL,
NULL,
evas_object_text_scale_update,
NULL,
NULL,
NULL,
@ -2217,15 +2213,16 @@ evas_object_text_was_opaque(Evas_Object *eo_obj EINA_UNUSED,
return 0;
}
static void
evas_object_text_scale_update(Evas_Object *eo_obj,
Evas_Object_Protected_Data *pd EINA_UNUSED,
void *type_private_data)
EOLIAN static void
_evas_text_efl_ui_base_scale_set(Evas_Object *eo_obj, Evas_Text_Data *o,
double scale)
{
Evas_Text_Data *o = type_private_data;
int size;
const char *font;
if (EINA_DBL_EQ(efl_ui_scale_get(eo_obj), scale)) return;
efl_ui_scale_set(efl_super(eo_obj, MY_CLASS), scale);
font = eina_stringshare_add(o->cur.font);
size = o->cur.size;
if (o->cur.font) eina_stringshare_del(o->cur.font);

View File

@ -708,9 +708,6 @@ static int evas_object_textblock_was_opaque(Evas_Object *eo_obj,
static void evas_object_textblock_coords_recalc(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
static void evas_object_textblock_scale_update(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
static const Evas_Object_Func object_func =
{
@ -732,7 +729,6 @@ static const Evas_Object_Func object_func =
NULL,
NULL,
NULL, /*evas_object_textblock_coords_recalc, <- disable - not useful. */
evas_object_textblock_scale_update,
NULL,
NULL,
NULL,
@ -14603,12 +14599,14 @@ evas_object_textblock_was_opaque(Evas_Object *eo_obj EINA_UNUSED,
return 0;
}
static void
evas_object_textblock_scale_update(Evas_Object *eo_obj EINA_UNUSED,
Evas_Object_Protected_Data *obj EINA_UNUSED,
void *type_private_data)
EOLIAN static void
_efl_canvas_text_efl_ui_base_scale_set(Evas_Object *eo_obj,
Efl_Canvas_Text_Data *o,
double scale)
{
Efl_Canvas_Text_Data *o = type_private_data;
if (EINA_DBL_EQ(efl_ui_scale_get(eo_obj), scale)) return;
efl_ui_scale_set(efl_super(eo_obj, MY_CLASS), scale);
_evas_textblock_invalidate_all(o);
_evas_textblock_changed(o, eo_obj);
o->last_w = -1;

View File

@ -113,10 +113,6 @@ static int evas_object_textgrid_was_opaque(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
void *type_private_data);
static void evas_object_textgrid_scale_update(Evas_Object *eo_obj,
Evas_Object_Protected_Data *pd,
void *type_private_data);
static const Evas_Object_Func object_func =
{
/* methods (compulsory) */
@ -137,7 +133,6 @@ static const Evas_Object_Func object_func =
NULL,
NULL,
NULL,
evas_object_textgrid_scale_update,
NULL,
NULL,
NULL,
@ -876,15 +871,16 @@ evas_object_textgrid_was_opaque(Evas_Object *eo_obj EINA_UNUSED,
return 0;
}
static void
evas_object_textgrid_scale_update(Evas_Object *eo_obj,
Evas_Object_Protected_Data *pd EINA_UNUSED,
void *type_private_data)
EOLIAN static void
_evas_textgrid_efl_ui_base_scale_set(Evas_Object *eo_obj, Evas_Textgrid_Data *o,
double scale)
{
int font_size;
const char *font_name;
Evas_Textgrid_Data *o = type_private_data;
if (EINA_DBL_EQ(efl_ui_scale_get(eo_obj), scale)) return;
efl_ui_scale_set(efl_super(eo_obj, MY_CLASS), scale);
font_name = eina_stringshare_add(o->cur.font_name);
font_size = o->cur.font_size;
if (o->cur.font_name) eina_stringshare_del(o->cur.font_name);

View File

@ -1,6 +1,7 @@
type @extern Evas.Text_Style_Type : __undefined_type; [[External text style type]]
class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Text.Font, Efl.Canvas.Filter.Internal)
class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties,
Efl.Text.Font, Efl.Canvas.Filter.Internal, Efl.Ui.Base)
{
[[Evas text class]]
legacy_prefix: evas_object_text;
@ -281,5 +282,6 @@ class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Text.Font
Efl.Canvas.Filter.Internal.filter_input_render;
Efl.Canvas.Filter.Internal.filter_state_prepare;
Efl.Canvas.Object.paragraph_direction { set; get; }
Efl.Ui.Base.scale { set; }
}
}

View File

@ -20,7 +20,8 @@ enum Evas.Textgrid.Font_Style {
/* XXX: Actual definition is in C. */
struct Evas.Textgrid.Cell; [[Evas textgrid cell data structure]]
class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties, Efl.Text.Font)
class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties, Efl.Text.Font,
Efl.Ui.Base)
{
[[Evas textgrid class]]
legacy_prefix: evas_object_textgrid;
@ -201,5 +202,6 @@ class Evas.Textgrid (Efl.Canvas.Object, Efl.Text.Properties, Efl.Text.Font)
Efl.Text.Properties.font { get; set; }
Efl.Text.Properties.font_source { get; set; }
Efl.Text.Font.font_bitmap_scalable { get; set; }
Efl.Ui.Base.scale { set; }
}
}

View File

@ -1265,8 +1265,6 @@ struct _Evas_Object_Func
void (*coords_recalc) (Evas_Object *obj, Evas_Object_Protected_Data *pd, void *type_private_data);
void (*scale_update) (Evas_Object *obj, Evas_Object_Protected_Data *pd, void *type_private_data);
int (*has_opaque_rect) (Evas_Object *obj, Evas_Object_Protected_Data *pd, void *type_private_data);
int (*get_opaque_rect) (Evas_Object *obj, Evas_Object_Protected_Data *pd, void *type_private_data,
Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);