diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index 8c6868b073..0a68cc1db7 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -85,6 +85,7 @@ static void st_collections_group_parts_part_effect(void); static void st_collections_group_parts_part_mouse_events(void); static void st_collections_group_parts_part_repeat_events(void); static void st_collections_group_parts_part_ignore_flags(void); +static void st_collections_group_parts_part_scale(void); static void st_collections_group_parts_part_pointer_mode(void); static void st_collections_group_parts_part_precise_is_inside(void); static void st_collections_group_parts_part_use_alternate_font_metrics(void); @@ -226,6 +227,7 @@ New_Statement_Handler statement_handlers[] = {"collections.group.parts.part.mouse_events", st_collections_group_parts_part_mouse_events}, {"collections.group.parts.part.repeat_events", st_collections_group_parts_part_repeat_events}, {"collections.group.parts.part.ignore_flags", st_collections_group_parts_part_ignore_flags}, + {"collections.group.parts.part.scale", st_collections_group_parts_part_scale}, {"collections.group.parts.part.pointer_mode", st_collections_group_parts_part_pointer_mode}, {"collections.group.parts.part.precise_is_inside", st_collections_group_parts_part_precise_is_inside}, {"collections.group.parts.part.use_alternate_font_metrics", st_collections_group_parts_part_use_alternate_font_metrics}, @@ -1440,6 +1442,7 @@ ob_collections_group_parts_part(void) ep->mouse_events = 1; ep->repeat_events = 0; ep->ignore_flags = EVAS_EVENT_FLAG_NONE; + ep->scale = 0; ep->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB; ep->precise_is_inside = 0; ep->use_alternate_font_metrics = 0; @@ -1610,6 +1613,35 @@ st_collections_group_parts_part_ignore_flags(void) NULL); } +/** + @page edcref + @property + scale + @parameters + [1 or 0] + @effect + Specifies whether the part will scale its size with an edje scaling + factor. By default scale is off (0) and the default scale factor is + 1.0 - that means no scaling. This would be used to scale properties + such as font size, min/max size of the part, and possibly can be used + to scale based on DPI of the target device. The reason to be selective + is that some things work well being scaled, others do not, so the + designer gets to choose what works best. + @endproperty +*/ +static void +st_collections_group_parts_part_scale(void) +{ + Edje_Part_Collection *pc; + Edje_Part *ep; + + check_arg_count(1); + + pc = evas_list_data(evas_list_last(edje_collections)); + ep = evas_list_data(evas_list_last(pc->parts)); + ep->scale = parse_bool(0); +} + /** @page edcref @property diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index c44cc98d1c..5009f01d24 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -171,6 +171,8 @@ extern "C" { EAPI void edje_thaw (void); EAPI void edje_fontset_append_set (const char *fonts); EAPI const char *edje_fontset_append_get (void); + EAPI void edje_scale_set (double scale); + EAPI double edje_scale_get (void); /* edje_load.c */ EAPI Evas_List *edje_file_collection_list (const char *file); diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index 37a41edd77..c946eb3998 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -280,6 +280,11 @@ _edje_part_recalc_single(Edje *ed, else maxw = MIN(ep->swallow_params.max.w, desc->max.w); } + if (ep->part->scale) + { + minw *= _edje_scale; + maxw *= _edje_scale; + } } // if (flags & FLAG_Y) { @@ -297,6 +302,11 @@ _edje_part_recalc_single(Edje *ed, else maxh = MIN(ep->swallow_params.max.h, desc->max.h); } + if (ep->part->scale) + { + minh *= _edje_scale; + maxh *= _edje_scale; + } } /* relative coords of top left & bottom right */ if (flags & FLAG_X) @@ -588,6 +598,9 @@ _edje_part_recalc_single(Edje *ed, stl = NULL; } + if (ep->part->scale) + evas_object_scale_set(ep->object, _edje_scale); + if (stl) { const char *ptxt; @@ -716,6 +729,8 @@ _edje_part_recalc_single(Edje *ed, inlined_font = 1; } } + if (ep->part->scale) + evas_object_scale_set(ep->object, _edje_scale); if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); else evas_object_text_font_source_set(ep->object, NULL); diff --git a/legacy/edje/src/lib/edje_data.c b/legacy/edje/src/lib/edje_data.c index 7723834cc5..cd83e96c26 100644 --- a/legacy/edje/src/lib/edje_data.c +++ b/legacy/edje/src/lib/edje_data.c @@ -357,13 +357,14 @@ _edje_edd_setup(void) eet_data_descriptor3_new(&eddc); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "name", name, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "id", id, EET_T_INT); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "type", type, EET_T_CHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "effect", effect, EET_T_CHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "mouse_events", mouse_events, EET_T_CHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "repeat_events", repeat_events, EET_T_CHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "type", type, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "effect", effect, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "mouse_events", mouse_events, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "repeat_events", repeat_events, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "ignore_flags", ignore_flags, EET_T_INT); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "pointer_mode", pointer_mode, EET_T_CHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "precise_is_inside", precise_is_inside, EET_T_CHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "scale", scale, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "pointer_mode", pointer_mode, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "precise_is_inside", precise_is_inside, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "clip_to_id", clip_to_id, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "use_alternate_font_metrics", use_alternate_font_metrics, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_part, Edje_Part, "default_desc", default_desc, _edje_edd_edje_part_description); diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 603ab3ef5e..79d8149eb4 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -485,9 +485,10 @@ struct _Edje_Part unsigned char mouse_events; /* it will affect/respond to mouse events */ unsigned char repeat_events; /* it will repeat events to objects below */ Evas_Event_Flags ignore_flags; + unsigned char scale; /* should certain properties scale with edje scale factor? */ unsigned char precise_is_inside; unsigned char use_alternate_font_metrics; - char pointer_mode; + unsigned char pointer_mode; }; struct _Edje_Part_Image_Id @@ -1003,6 +1004,7 @@ extern Evas_List *_edje_animators; extern Evas_List *_edje_edjes; extern char *_edje_fontset_append; +extern double _edje_scale; void _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos); Edje_Part_Description *_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name, double val); diff --git a/legacy/edje/src/lib/edje_text.c b/legacy/edje/src/lib/edje_text.c index 1637a6aa47..70f0714dab 100644 --- a/legacy/edje/src/lib/edje_text.c +++ b/legacy/edje/src/lib/edje_text.c @@ -158,6 +158,7 @@ _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep, *free_text = 0; + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, size); evas_object_text_text_set(ep->object, text); @@ -419,6 +420,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); else evas_object_text_font_source_set(ep->object, NULL); + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, size); evas_object_text_text_set(ep->object, text); part_get_geometry(ep, &tw, &th); @@ -435,6 +437,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); else evas_object_text_font_source_set(ep->object, NULL); + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, size); part_get_geometry(ep, &tw, &th); if ((size > 0) && (tw == 0)) break; @@ -453,6 +456,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); else evas_object_text_font_source_set(ep->object, NULL); + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, size); part_get_geometry(ep, &tw, &th); if ((size > 0) && (tw == 0)) break; @@ -470,6 +474,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); else evas_object_text_font_source_set(ep->object, NULL); + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, size); evas_object_text_text_set(ep->object, text); part_get_geometry(ep, &tw, &th); @@ -490,6 +495,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); else evas_object_text_font_source_set(ep->object, NULL); + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, size); part_get_geometry(ep, &tw, &th); if ((size > 0) && (th == 0)) break; @@ -500,6 +506,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, { int current; + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, 10); part_get_geometry(ep, &tw, &th); @@ -523,6 +530,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, { current = (top + bottom) / 2; + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, current); part_get_geometry(ep, &tw, &th); @@ -536,6 +544,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, { current++; + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, current); part_get_geometry(ep, &tw, &th); } while (th <= sh); @@ -567,6 +576,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); else evas_object_text_font_source_set(ep->object, NULL); + if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale); evas_object_text_font_set(ep->object, font, size); evas_object_text_text_set(ep->object, text); part_get_geometry(ep, &tw, &th); diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index ec3eb3f924..e5ee43199b 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -11,6 +11,7 @@ static Evas_Hash *_edje_text_class_hash = NULL; static Evas_Hash *_edje_text_class_member_hash = NULL; char *_edje_fontset_append = NULL; +double _edje_scale = 1.0; typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data; @@ -37,6 +38,7 @@ edje_freeze(void) { Evas_List *l; + // FIXME: could just have a global freeze instead of per object for (l = _edje_edjes; l; l = l->next) edje_object_freeze((Evas_Object *)(l->data)); } @@ -50,6 +52,7 @@ edje_thaw(void) { Evas_List *l; + // FIXME: could just have a global freeze instead of per object for (l = _edje_edjes; l; l = l->next) edje_object_thaw((Evas_Object *)(l->data)); } @@ -70,6 +73,23 @@ edje_fontset_append_get(void) return _edje_fontset_append; } +EAPI void +edje_scale_set(double scale) +{ + Evas_List *l; + + if (_edje_scale == scale) return; + _edje_scale = scale; + for (l = _edje_edjes; l; l = l->next) + edje_object_calc_force((Evas_Object *)(l->data)); +} + +EAPI double +edje_scale_get(void) +{ + return _edje_scale; +} + /* FIXDOC: Verify/Expand */ /** Get Edje object data * @param obj A valid Evas_Object handle