forked from enlightenment/efl
Ali Alzyod
8f87a2411a
Summary: **Content Fit Feature for Evas_Object_Textblock** This Feature is available at **Evas **object level. And **Edje **level (where it is internally use evas functionality) This feature will allow text block to fit its content font size to proper size to fit its area. **Main Properties:** Fit Modes : None=Default, Width, Height, All [Width+Height] Fit Size Range : Contains maximum and minimum font size to be used (and in between). Fit Step Size : Step(Jump) value when trying fonts sizes between Size_Range max and min. Fit Size Array : Other way to resize font, where you explicitly select font sizes to be uses (for example [20, 50, 100] it will try 3 sizes only) Text Fit feature was available in Edje but: 1- It doesn't effected by ellipsis or warping in font style (or do not handle the in right way) 2- Accuracy is not good (specially if you have fix pixel size elements (spaces,tabs,items)) 3- No (Step size, Size Array) available. Test Plan: To check the Feature > elementary_test > fit > textbock fit You can modify all the modes and properties These are two examples, One using Evas other uses Edje **Evas** ``` #include <Elementary.h> enum BUTTON{ BUTTON_MODE = 0, BUTTON_MAX = 1, BUTTON_MIN = 2, BUTTON_STEP = 3, BUTTON_ARRAY = 4, BUTTON_CONTENT = 5, BUTTON_STYLE = 6, BUTTON_ALL = BUTTON_STYLE+1, }; char* BUTTON_STR[BUTTON_ALL] ={ "MODE", "MAX", "MIN", "STEP", "ARRAY", "CONTENT", "STYLE", }; char *contents[] = { "Hello World", "This is Line<br>THis is other Line", "This text contains <font_size=20 color=#F00>SPECIFIC SIZE</font_size> that does not effected by fit mode" }; char *styles[] = { "DEFAULT='font=sans font_size=30 color=#000 wrap=mixed ellipsis=1.0'", "DEFAULT='font=sans font_size=30 color=#000 wrap=mixed'", "DEFAULT='font=sans font_size=30 color=#000 ellipsis=1.0'", "DEFAULT='font=sans font_size=30 color=#000'", }; char *styles_names[] = { "wrap=<color=#F00>mixed</color> ellipsis=<color=#F00>1.0</color>", "wrap=<color=#F00>mixed</color> ellipsis=<color=#F00>NONE</color>", "wrap=<color=#F00>NONE</color> ellipsis=<color=#F00>1.0</color>", "wrap=<color=#F00>NONE</color> ellipsis=<color=#F00>NONE</color>", }; typedef struct _APP { Evas_Object *win, *box, *txtblock,*bg, *boxHor, *boxHor2; Eo *btn[BUTTON_ALL]; Eo *lbl_status; char * str; unsigned int i_contnet, i_style; } APP; APP *app; char * get_fit_status(Eo * textblock); static void _btn_clicked(void *data EINA_UNUSED, Eo *obj, void *eventInfo EINA_UNUSED){ if (obj == app->btn[BUTTON_MODE]) { unsigned int options; evas_textblock_fit_options_get(app->txtblock, &options); if (options == TEXTBLOCK_FIT_MODE_NONE) evas_textblock_fit_options_set(app->txtblock, TEXTBLOCK_FIT_MODE_HEIGHT); else if (options == TEXTBLOCK_FIT_MODE_HEIGHT) evas_textblock_fit_options_set(app->txtblock, TEXTBLOCK_FIT_MODE_WIDTH); else if (options == TEXTBLOCK_FIT_MODE_WIDTH) evas_textblock_fit_options_set(app->txtblock, TEXTBLOCK_FIT_MODE_ALL); else if (options == TEXTBLOCK_FIT_MODE_ALL) evas_textblock_fit_options_set(app->txtblock, TEXTBLOCK_FIT_MODE_NONE); } else if (obj == app->btn[BUTTON_MAX]) { unsigned int min, max; evas_textblock_fit_size_range_get(app->txtblock, &min, &max); max -= 5; evas_textblock_fit_size_range_set(app->txtblock, min, max); } else if (obj == app->btn[BUTTON_MIN]) { unsigned int min, max; evas_textblock_fit_size_range_get(app->txtblock, &min, &max); min += 5; evas_textblock_fit_size_range_set(app->txtblock, min, max); } else if (obj == app->btn[BUTTON_STEP]) { unsigned int step; evas_textblock_fit_step_size_get(app->txtblock, &step); step++; evas_textblock_fit_step_size_set(app->txtblock, step); } else if (obj == app->btn[BUTTON_ARRAY]) { unsigned int font_size[] = {10, 50, 100 ,150}; evas_textblock_fit_size_array_set(app->txtblock,font_size,4); } else if (obj == app->btn[BUTTON_CONTENT]) { app->i_contnet++; if(app->i_contnet>=sizeof(contents)/sizeof(char*)) app->i_contnet=0; evas_object_textblock_text_markup_set(app->txtblock,contents[app->i_contnet]); } else if (obj == app->btn[BUTTON_STYLE]) { app->i_style++; if(app->i_style>=sizeof(styles)/sizeof(char*)) app->i_style=0; Evas_Textblock_Style *style = evas_object_textblock_style_get(app->txtblock); evas_textblock_style_set(style,styles[app->i_style]); } elm_object_text_set(app->lbl_status, get_fit_status(app->txtblock)); } char * get_fit_status(Eo * textblock) { static char status[0xFFF]; unsigned int options,min,max,step,size_array[256]; size_t size_array_len; evas_textblock_fit_options_get(textblock,&options); evas_textblock_fit_size_range_get(textblock,&min,&max); evas_textblock_fit_step_size_get(textblock,&step); evas_textblock_fit_size_array_get(textblock,NULL,&size_array_len,0); if (size_array_len>255) size_array_len = 255; evas_textblock_fit_size_array_get(textblock,size_array,NULL,size_array_len); strcpy(status,"Mode : "); if (options == TEXTBLOCK_FIT_MODE_NONE) strcat(status,"MODE_NONE"); else if (options == TEXTBLOCK_FIT_MODE_HEIGHT) strcat(status,"MODE_HEIGHT"); else if (options == TEXTBLOCK_FIT_MODE_WIDTH) strcat(status,"MODE_WIDTH"); else if (options == TEXTBLOCK_FIT_MODE_ALL) strcat(status,"MODE_ALL"); strcat(status,"<br>"); sprintf(status + strlen(status),"Max : %d<br>",max); sprintf(status + strlen(status),"Min : %d<br>",min); sprintf(status + strlen(status),"Step : %d<br>",step); sprintf(status + strlen(status),"Array : [ "); for (size_t i = 0 ; i < 10 ; i++) { if(i<size_array_len) sprintf(status + strlen(status)," %d,",size_array[i]); } if(10<size_array_len) sprintf(status + strlen(status)," ... "); sprintf(status + strlen(status)," ]"); sprintf(status + strlen(status),"<br>"); sprintf(status + strlen(status),"%s",styles_names[app->i_style]); return status; } int elm_main(int argc, char **argv) { app = calloc(sizeof(APP), 1); elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); app->win = elm_win_util_standard_add("Main", "App"); elm_win_autodel_set(app->win, EINA_TRUE); app->box = elm_box_add(app->win); app->boxHor = elm_box_add(app->box); app->boxHor2 = elm_box_add(app->box); app->txtblock = evas_object_textblock_add(app->box); app->bg = elm_bg_add(app->box); elm_bg_color_set(app->bg,255,255,255); Evas_Textblock_Style *style = evas_textblock_style_new(); evas_textblock_style_set(style,styles[0]); evas_object_textblock_style_set(app->txtblock,style); evas_object_textblock_text_markup_set(app->txtblock,contents[0]); elm_box_horizontal_set(app->boxHor, EINA_TRUE); elm_box_horizontal_set(app->boxHor2, EINA_TRUE); evas_object_size_hint_weight_set(app->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(app->box, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(app->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(app->box, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(app->txtblock); evas_object_show(app->bg); evas_object_show(app->box); evas_object_show(app->boxHor); evas_object_show(app->boxHor2); elm_box_pack_end(app->box, app->bg); elm_box_pack_end(app->box, app->boxHor); elm_box_pack_end(app->box, app->boxHor2); elm_object_content_set(app->bg,app->txtblock); elm_win_resize_object_add(app->win, app->box); evas_object_resize(app->win, 320, 480); for(int i = 0 ; i < BUTTON_ALL ; i++) { app->btn[i] = elm_button_add(app->boxHor); evas_object_smart_callback_add(app->btn[i], "clicked", _btn_clicked, NULL); elm_object_text_set(app->btn[i], BUTTON_STR[i]); elm_box_pack_end(app->boxHor, app->btn[i]); evas_object_show(app->btn[i]); } app->lbl_status = elm_label_add(app->boxHor2); elm_object_text_set(app->lbl_status, get_fit_status(app->txtblock)); elm_box_pack_end(app->boxHor2, app->lbl_status); evas_object_show(app->lbl_status); evas_object_size_hint_weight_set(app->txtblock, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND); evas_object_size_hint_align_set(app->txtblock, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(app->bg, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND); evas_object_size_hint_align_set(app->bg, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(app->win); elm_run(); return 0; } ELM_MAIN() ``` **Edje** ``` // compile: edje_cc source.edc // run: edje_player source.edje collections { styles { style { name: "text_style"; base: "font=sans font_size=30 color=#FFF wrap=mixed ellipsis=1.0"; tag: "br" "\n"; tag: "ps" "ps"; tag: "tab" "\t"; tag: "b" "+ font_weight=Bold"; } } group { name: "my_group"; // must be the same as in source.c parts { part { name: "background"; type: RECT; scale: 1; description { color: 0 0 0 0; rel1.relative: 0.0 0.0; rel2.relative: 1.0 1.0; } } part { name: "text"; type: TEXTBLOCK; scale: 1; entry_mode: NONE; effect: OUTLINE_SHADOW; description { state: "default" 0.0; rel1.to : "background"; rel1.relative: 0.0 0.0; rel2.to : "background"; rel2.relative: 1.0 1.0; text { style: "text_style"; align: 0.0 0.0; text: "Hello World This is Me"; fit: 1 1; fit_step: 1; size_range: 30 200; //fit_size_array: 20 40 60 80 100 200; } } } } } } ``` Found Task T5724 relative to this Feature Reviewers: woohyun, bowonryu, cedric, raster Reviewed By: woohyun Subscribers: a.srour, #committers, #reviewers, cedric Tags: #efl Differential Revision: https://phab.enlightenment.org/D9280 |
||
---|---|---|
.. | ||
efl_canvas_animation.c | ||
efl_canvas_animation.eo | ||
efl_canvas_animation_alpha.c | ||
efl_canvas_animation_alpha.eo | ||
efl_canvas_animation_alpha_private.h | ||
efl_canvas_animation_group.c | ||
efl_canvas_animation_group.eo | ||
efl_canvas_animation_group_parallel.c | ||
efl_canvas_animation_group_parallel.eo | ||
efl_canvas_animation_group_parallel_private.h | ||
efl_canvas_animation_group_private.h | ||
efl_canvas_animation_group_sequential.c | ||
efl_canvas_animation_group_sequential.eo | ||
efl_canvas_animation_group_sequential_private.h | ||
efl_canvas_animation_private.h | ||
efl_canvas_animation_rotate.c | ||
efl_canvas_animation_rotate.eo | ||
efl_canvas_animation_rotate_private.h | ||
efl_canvas_animation_scale.c | ||
efl_canvas_animation_scale.eo | ||
efl_canvas_animation_scale_private.h | ||
efl_canvas_animation_translate.c | ||
efl_canvas_animation_translate.eo | ||
efl_canvas_animation_translate_private.h | ||
efl_canvas_animation_types.eot | ||
efl_canvas_event_grabber.c | ||
efl_canvas_event_grabber.eo | ||
efl_canvas_event_grabber_eo.legacy.c | ||
efl_canvas_event_grabber_eo.legacy.h | ||
efl_canvas_filter_internal.eo | ||
efl_canvas_group.eo | ||
efl_canvas_group_eo.legacy.c | ||
efl_canvas_group_eo.legacy.h | ||
efl_canvas_image.c | ||
efl_canvas_image.eo | ||
efl_canvas_image_internal.eo | ||
efl_canvas_object.eo | ||
efl_canvas_object_animation.c | ||
efl_canvas_object_animation.eo | ||
efl_canvas_object_eo.legacy.c | ||
efl_canvas_object_eo.legacy.h | ||
efl_canvas_pointer.eo | ||
efl_canvas_polygon.eo | ||
efl_canvas_proxy.c | ||
efl_canvas_proxy.eo | ||
efl_canvas_rectangle.eo | ||
efl_canvas_scene.eo | ||
efl_canvas_scene3d.c | ||
efl_canvas_scene3d.eo | ||
efl_canvas_snapshot.c | ||
efl_canvas_snapshot.eo | ||
efl_canvas_surface.c | ||
efl_canvas_surface.eo | ||
efl_canvas_surface.h | ||
efl_canvas_surface_tbm.c | ||
efl_canvas_surface_tbm.eo | ||
efl_canvas_surface_wayland.c | ||
efl_canvas_surface_wayland.eo | ||
efl_canvas_surface_x11.c | ||
efl_canvas_surface_x11.eo | ||
efl_canvas_textblock.eo | ||
efl_canvas_textblock_eo.legacy.c | ||
efl_canvas_textblock_eo.legacy.h | ||
efl_canvas_textblock_factory.eo | ||
efl_canvas_textblock_internal.h | ||
efl_canvas_vg_container.c | ||
efl_canvas_vg_container.eo | ||
efl_canvas_vg_container_eo.legacy.c | ||
efl_canvas_vg_container_eo.legacy.h | ||
efl_canvas_vg_gradient.c | ||
efl_canvas_vg_gradient.eo | ||
efl_canvas_vg_gradient_linear.c | ||
efl_canvas_vg_gradient_linear.eo | ||
efl_canvas_vg_gradient_radial.c | ||
efl_canvas_vg_gradient_radial.eo | ||
efl_canvas_vg_image.c | ||
efl_canvas_vg_image.eo | ||
efl_canvas_vg_node.c | ||
efl_canvas_vg_node.eo | ||
efl_canvas_vg_node_eo.legacy.c | ||
efl_canvas_vg_node_eo.legacy.h | ||
efl_canvas_vg_object.c | ||
efl_canvas_vg_object.eo | ||
efl_canvas_vg_object_eo.legacy.c | ||
efl_canvas_vg_object_eo.legacy.h | ||
efl_canvas_vg_shape.c | ||
efl_canvas_vg_shape.eo | ||
efl_canvas_vg_shape_eo.legacy.c | ||
efl_canvas_vg_shape_eo.legacy.h | ||
efl_canvas_vg_utils.c | ||
efl_gfx_mapping.c | ||
efl_gfx_mapping.eo | ||
efl_gfx_vg_value_provider.c | ||
efl_gfx_vg_value_provider.eo | ||
efl_gfx_vg_value_provider.h | ||
efl_input_clickable.c | ||
efl_input_clickable.eo | ||
efl_input_device.c | ||
efl_input_device.eo | ||
efl_input_event.c | ||
efl_input_event.eo | ||
efl_input_focus.c | ||
efl_input_focus.eo | ||
efl_input_hold.c | ||
efl_input_hold.eo | ||
efl_input_interface.eo | ||
efl_input_key.c | ||
efl_input_key.eo | ||
efl_input_pointer.c | ||
efl_input_pointer.eo | ||
efl_input_state.eo | ||
efl_input_types.eot | ||
efl_text_attribute_factory.c | ||
efl_text_attribute_factory.eo | ||
efl_text_cursor.c | ||
efl_text_cursor.eo | ||
evas_async_events.c | ||
evas_box_eo.c | ||
evas_box_eo.h | ||
evas_box_eo.hh | ||
evas_box_eo.impl.hh | ||
evas_box_eo.legacy.c | ||
evas_box_eo.legacy.h | ||
evas_callbacks.c | ||
evas_canvas3d_camera.c | ||
evas_canvas3d_camera.eo | ||
evas_canvas3d_eet.c | ||
evas_canvas3d_light.c | ||
evas_canvas3d_light.eo | ||
evas_canvas3d_material.c | ||
evas_canvas3d_material.eo | ||
evas_canvas3d_mesh.c | ||
evas_canvas3d_mesh.eo | ||
evas_canvas3d_node.c | ||
evas_canvas3d_node.eo | ||
evas_canvas3d_node_callback.h | ||
evas_canvas3d_object.c | ||
evas_canvas3d_object.eo | ||
evas_canvas3d_primitive.c | ||
evas_canvas3d_primitive.eo | ||
evas_canvas3d_scene.c | ||
evas_canvas3d_scene.eo | ||
evas_canvas3d_texture.c | ||
evas_canvas3d_texture.eo | ||
evas_canvas3d_types.eot | ||
evas_canvas_eo.c | ||
evas_canvas_eo.h | ||
evas_canvas_eo.hh | ||
evas_canvas_eo.impl.hh | ||
evas_canvas_eo.legacy.c | ||
evas_canvas_eo.legacy.h | ||
evas_clip.c | ||
evas_data.c | ||
evas_device.c | ||
evas_events.c | ||
evas_events_legacy.c | ||
evas_filter_mixin.c | ||
evas_focus.c | ||
evas_font_dir.c | ||
evas_gl.c | ||
evas_grid_eo.c | ||
evas_grid_eo.h | ||
evas_grid_eo.hh | ||
evas_grid_eo.impl.hh | ||
evas_grid_eo.legacy.c | ||
evas_grid_eo.legacy.h | ||
evas_image_eo.c | ||
evas_image_eo.h | ||
evas_image_eo.hh | ||
evas_image_eo.impl.hh | ||
evas_image_eo.legacy.h | ||
evas_image_legacy.c | ||
evas_image_private.h | ||
evas_key.c | ||
evas_key_grab.c | ||
evas_layer.c | ||
evas_line_eo.c | ||
evas_line_eo.h | ||
evas_line_eo.hh | ||
evas_line_eo.impl.hh | ||
evas_line_eo.legacy.c | ||
evas_line_eo.legacy.h | ||
evas_main.c | ||
evas_map.c | ||
evas_map.h | ||
evas_name.c | ||
evas_object_box.c | ||
evas_object_grid.c | ||
evas_object_image.c | ||
evas_object_inform.c | ||
evas_object_intercept.c | ||
evas_object_line.c | ||
evas_object_main.c | ||
evas_object_polygon.c | ||
evas_object_rectangle.c | ||
evas_object_smart.c | ||
evas_object_smart_clipped.c | ||
evas_object_table.c | ||
evas_object_text.c | ||
evas_object_textblock.c | ||
evas_object_textgrid.c | ||
evas_out.c | ||
evas_polygon_private.h | ||
evas_rectangle.c | ||
evas_render.c | ||
evas_smart.c | ||
evas_stack.x | ||
evas_stats.c | ||
evas_table_eo.c | ||
evas_table_eo.h | ||
evas_table_eo.hh | ||
evas_table_eo.impl.hh | ||
evas_table_eo.legacy.c | ||
evas_table_eo.legacy.h | ||
evas_text_eo.c | ||
evas_text_eo.h | ||
evas_text_eo.hh | ||
evas_text_eo.impl.hh | ||
evas_text_eo.legacy.c | ||
evas_text_eo.legacy.h | ||
evas_textblock_hyphenation.x | ||
evas_textblock_legacy.h | ||
evas_textgrid_eo.c | ||
evas_textgrid_eo.h | ||
evas_textgrid_eo.hh | ||
evas_textgrid_eo.impl.hh | ||
evas_textgrid_eo.legacy.c | ||
evas_textgrid_eo.legacy.h | ||
evas_touch_point.c | ||
evas_vg_private.h | ||
meson.build |