From e55b91aa910cd79ba08579b2e64ea2820d70c12b Mon Sep 17 00:00:00 2001 From: Daniel Hirt Date: Tue, 23 May 2017 16:04:04 +0300 Subject: [PATCH] Ui text: use 'wrap' and 'multiline' properties --- src/bin/elementary/test_efl_ui_text.c | 34 +++-- .../efl_ui_internal_text_interactive.c | 23 +--- .../efl_ui_internal_text_interactive.eo | 1 - src/lib/elementary/efl_ui_text.c | 116 +++++++----------- src/lib/elementary/efl_ui_text_interactive.eo | 11 +- 5 files changed, 77 insertions(+), 108 deletions(-) diff --git a/src/bin/elementary/test_efl_ui_text.c b/src/bin/elementary/test_efl_ui_text.c index a8e05b9680..15c4a2b077 100644 --- a/src/bin/elementary/test_efl_ui_text.c +++ b/src/bin/elementary/test_efl_ui_text.c @@ -115,22 +115,31 @@ my_efl_ui_text_bt_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info E "size=32x32 href=emoticon"); } -const char *_wrap_modes[4] = { "none", "char", "word", "mixed" }; - static void my_efl_ui_text_bt_6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - char style[128]; - Evas_Object *en = data; - size_t idx = (size_t) efl_key_data_get(en, "wrap_idx"); - idx = (idx + 1) % 4; - efl_key_data_set(en, "wrap_idx", (void *)idx); + Eo *text_obj = data; - sprintf(style, "DEFAULT='font=Sans font_size=12 color=#fff wrap=%s'", - _wrap_modes[idx]); - efl_canvas_text_style_set(en, NULL, style); - printf("wrap mode changed to '%s'\n", _wrap_modes[idx]); + Efl_Text_Format_Wrap wrap = efl_text_format_wrap_get(text_obj); + switch(wrap) + { + case EFL_TEXT_FORMAT_WRAP_NONE: + wrap = EFL_TEXT_FORMAT_WRAP_CHAR; + break; + case EFL_TEXT_FORMAT_WRAP_CHAR: + wrap = EFL_TEXT_FORMAT_WRAP_WORD; + break; + case EFL_TEXT_FORMAT_WRAP_WORD: + wrap = EFL_TEXT_FORMAT_WRAP_MIXED; + break; + case EFL_TEXT_FORMAT_WRAP_MIXED: + wrap = EFL_TEXT_FORMAT_WRAP_NONE; + break; + default: + break; + } + efl_text_format_wrap_set(text_obj, wrap); } static void @@ -154,7 +163,8 @@ test_efl_ui_text(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve elm_win_resize_object_add(win, bx); evas_object_show(bx); - en = efl_add(EFL_UI_TEXT_CLASS, win); + en = efl_add(EFL_UI_TEXT_CLASS, win, + efl_text_format_multiline_set(efl_added, EINA_TRUE)); printf("Added Efl.Ui.Text object\n"); efl_key_data_set(en, "wrap_idx", 0); diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c index b5ef29b734..028135353e 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.c +++ b/src/lib/elementary/efl_ui_internal_text_interactive.c @@ -16,7 +16,6 @@ typedef struct _Efl_Ui_Internal_Text_Interactive_Data Evas_Textblock_Cursor *preedit_start, *preedit_end; Eina_List *seq; char *selection; - Eina_Bool multiline : 1; Eina_Bool composing : 1; Eina_Bool selecting : 1; Eina_Bool have_selection : 1; @@ -730,7 +729,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void super = evas_key_modifier_is_set(ev->modifiers, "Super"); altgr = evas_key_modifier_is_set(ev->modifiers, "AltGr"); #endif - multiline = en->multiline; + multiline = efl_text_format_multiline_get(obj); /* Translate some keys to strings. */ if (!strcmp(ev->key, "Tab")) @@ -1253,6 +1252,9 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo Evas_Event_Mouse_Move *ev = event_info; Evas_Coord x, y, w, h; Evas_Textblock_Cursor *tc; + Eina_Bool multiline; + + multiline = efl_text_format_multiline_get(obj); #ifdef HAVE_ECORE_IMF if (en->imf_context) @@ -1274,7 +1276,7 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo cx = ev->cur.canvas.x - x; cy = ev->cur.canvas.y - y; - if (en->multiline) + if (multiline) { efl_canvas_text_cursor_coord_set(cur, cx, cy); } @@ -1301,7 +1303,6 @@ EOLIAN static Efl_Object * _efl_ui_internal_text_interactive_efl_object_constructor(Eo *obj, Efl_Ui_Internal_Text_Interactive_Data *en) { en->select_allow = EINA_TRUE; - en->multiline = EINA_TRUE; en->editable = EINA_TRUE; return efl_constructor(efl_super(obj, MY_CLASS)); } @@ -1381,7 +1382,7 @@ _efl_ui_internal_text_interactive_efl_object_finalize(Eo *obj, Efl_Ui_Internal_T ecore_imf_context_input_panel_language_set(en->imf_context, ECORE_IMF_INPUT_PANEL_LANG_ALPHABET); #endif - if (en->multiline) + if (efl_text_format_multiline_get(obj)) ecore_imf_context_input_hint_set(en->imf_context, ecore_imf_context_input_hint_get(en->imf_context) | ECORE_IMF_INPUT_HINT_MULTILINE); } @@ -1410,18 +1411,6 @@ _efl_ui_internal_text_interactive_efl_ui_text_interactive_selection_cursors_get( if (end) *end = pd->sel_end; } -EOLIAN static void -_efl_ui_internal_text_interactive_efl_ui_text_interactive_multiline_set(Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *pd, Eina_Bool enabled) -{ - pd->multiline = enabled; -} - -EOLIAN static Eina_Bool -_efl_ui_internal_text_interactive_efl_ui_text_interactive_multiline_get(Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *pd) -{ - return pd->multiline; -} - EOLIAN static void _efl_ui_internal_text_interactive_efl_ui_text_interactive_editable_set(Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *sd, Eina_Bool editable) { diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.eo b/src/lib/elementary/efl_ui_internal_text_interactive.eo index a79cc70b2d..034576f019 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.eo +++ b/src/lib/elementary/efl_ui_internal_text_interactive.eo @@ -9,7 +9,6 @@ class Efl.Ui.Internal.Text.Interactive (Efl.Canvas.Text, Efl.Ui.Text.Interactive Efl.Object.finalize; Efl.Ui.Text.Interactive.selection_allowed { get; set; } Efl.Ui.Text.Interactive.selection_cursors { get; } - Efl.Ui.Text.Interactive.multiline { get; set; } Efl.Ui.Text.Interactive.editable { get; set; } } } diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c index df169d50bf..4c2274ef20 100644 --- a/src/lib/elementary/efl_ui_text.c +++ b/src/lib/elementary/efl_ui_text.c @@ -56,7 +56,7 @@ struct _Efl_Ui_Text_Data const char *text; const char *file; Elm_Text_Format format; - Evas_Coord last_w, ent_mw, ent_mh; + Evas_Coord ent_w, ent_h; Evas_Coord downx, downy; Evas_Coord ox, oy; Eina_List *anchors; @@ -1070,91 +1070,60 @@ EOLIAN static void _efl_ui_text_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Text_Data *sd) { Evas_Coord minw, minh, resw, resh; + Evas_Coord fw, fh; + Eo *sw; + Eina_Bool wrap; evas_object_geometry_get(obj, NULL, NULL, &resw, &resh); - if (!sd->changed && (sd->last_w == resw)) - { - if (sd->scroll) - { - if (sd->text_obj) - { - Evas_Coord vw = 0, vh = 0, h = 0; + sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); + if (!sw) return; - // Called for line wrapping + scrolling; use the viewport - // width and the formatted height as proper constraints. - elm_interface_scrollable_content_viewport_geometry_get - (obj, NULL, NULL, &vw, &vh); + wrap = efl_text_format_wrap_get(sw); - efl_canvas_text_size_formatted_get(sd->text_obj, NULL, &h); - if (vh > h) h = vh; + if (!sd->changed && (resw == sd->ent_w) && (resh == sd->ent_h)) return; + + sd->changed = EINA_FALSE; + sd->ent_w = resw; + sd->ent_h = resh; - evas_object_resize(sd->entry_edje, vw, h); - } - } - return; - } evas_event_freeze(evas_object_evas_get(obj)); - sd->changed = EINA_FALSE; - sd->last_w = resw; if (sd->scroll) { - Evas_Coord vw = 0, vh = 0, vmw = 0, vmh = 0, w = -1, h = -1; + Evas_Coord vw, vh; + Evas_Coord tw, th; + elm_interface_scrollable_content_viewport_geometry_get(obj, NULL, NULL, &vw, &vh); + efl_gfx_size_set(sd->entry_edje, vw, vh); + efl_gfx_size_get(sw, &tw, &th); + efl_canvas_text_size_formatted_get(sw, &fw, &fh); + evas_object_size_hint_min_set(sw, fw, fh); + edje_object_size_min_calc(sd->entry_edje, &minw, &minh); + evas_object_size_hint_min_set(sw, -1, -1); - // XXX: no need for the following line. It's been commented out. - // sd->scr_edje is the resize_object of this widget. It's already - // resized when gfx_size_set was called on this widget. - //evas_object_resize(sd->scr_edje, resw, resh); + if (vw > minw) minw = vw; + efl_gfx_size_set(sd->entry_edje, minw, minh); - edje_object_size_min_calc(sd->scr_edje, &vmw, &vmh); - elm_interface_scrollable_content_viewport_geometry_get - (obj, NULL, NULL, &vw, &vh); - edje_object_size_min_restricted_calc - (sd->entry_edje, &minw, &minh, vw, 0); - elm_coords_finger_size_adjust(1, &minw, 1, &minh); - - /* This is a hack to workaround the way min size hints - * are treated. If the minimum width is smaller than the - * restricted width, it means the minimum doesn't - * matter. */ - if (minw <= vw) + if (!efl_text_format_multiline_get(sw)) { - Evas_Coord ominw = -1; - - efl_gfx_size_hint_combined_min_get(sd->entry_edje, &ominw, NULL); - minw = ominw; + evas_object_size_hint_min_set(obj, -1, minh); } - sd->ent_mw = minw; - sd->ent_mh = minh; - - if ((minw > 0) && (vw < minw)) vw = minw; - if (minh > vh) vh = minh; - - if (sd->single_line) h = vmh + minh; - else h = vmh; - - evas_object_resize(sd->entry_edje, vw, vh); - evas_object_size_hint_min_set(obj, w, h); - - if (sd->single_line) - evas_object_size_hint_max_set(obj, -1, h); - else - evas_object_size_hint_max_set(obj, -1, -1); } else { - Evas_Coord ominw, ominh; - Eo *sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); - efl_canvas_text_size_native_get(sw, &resw, &resh); - evas_object_size_hint_min_set(sw, resw, resh); - edje_object_size_min_calc(sd->entry_edje, &ominw, &ominh); - evas_object_size_hint_min_set(obj, ominw, ominh); + efl_canvas_text_size_formatted_get(sw, &fw, &fh); + evas_object_size_hint_min_set(sw, fw, fh); + edje_object_size_min_calc(sd->entry_edje, &minw, &minh); + evas_object_size_hint_min_set(sw, -1, -1); + if (wrap == EFL_TEXT_FORMAT_WRAP_NONE) + { + evas_object_size_hint_min_set(obj, minw, minh); + } } - - _cursor_geometry_recalc(obj); evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); + + _cursor_geometry_recalc(obj); } static void @@ -2105,9 +2074,13 @@ _entry_changed_handle(void *data, { Evas_Coord minh; const char *text; + Eina_Bool single_line; + Eo *obj = data; EFL_UI_TEXT_DATA_GET(data, sd); + single_line = !efl_text_format_multiline_get(obj); + evas_event_freeze(evas_object_evas_get(data)); sd->changed = EINA_TRUE; /* Reset the size hints which are no more relevant. Keep the @@ -2116,6 +2089,12 @@ _entry_changed_handle(void *data, evas_object_size_hint_min_get(data, NULL, &minh); evas_object_size_hint_min_set(data, -1, minh); + if (sd->single_line != single_line) + { + sd->single_line = single_line; + elm_obj_widget_theme_apply(data); + } + elm_layout_sizing_eval(data); ELM_SAFE_FREE(sd->text, eina_stringshare_del); ELM_SAFE_FREE(sd->delay_write, ecore_timer_del); @@ -3023,8 +3002,6 @@ _efl_ui_text_resize_internal(Evas_Object *obj) elm_interface_scrollable_content_viewport_geometry_get (obj, NULL, NULL, &vw, &vh); - if (vw < sd->ent_mw) vw = sd->ent_mw; - if (vh < sd->ent_mh) vh = sd->ent_mh; evas_object_resize(sd->entry_edje, vw, vh); } @@ -3272,6 +3249,8 @@ _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv) priv->editable = EINA_TRUE; priv->sel_allow = EINA_TRUE; + priv->single_line = !efl_text_format_multiline_get(text_obj); + priv->drop_format = ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE; elm_drop_target_add(obj, priv->drop_format, _dnd_enter_cb, NULL, @@ -4050,7 +4029,6 @@ _efl_ui_text_scrollable_set(Eo *obj, Efl_Ui_Text_Data *sd, Eina_Bool scroll) elm_widget_on_show_region_hook_set(obj, NULL, NULL); } - sd->last_w = -1; _update_decorations(obj); elm_obj_widget_theme_apply(obj); } diff --git a/src/lib/elementary/efl_ui_text_interactive.eo b/src/lib/elementary/efl_ui_text_interactive.eo index 19873e4f70..de0017edbf 100644 --- a/src/lib/elementary/efl_ui_text_interactive.eo +++ b/src/lib/elementary/efl_ui_text_interactive.eo @@ -10,7 +10,8 @@ struct Efl.Ui.Text.Interactive.Change_Info { merge: bool; [[$true if can be merged with the previous one. Used for example with insertion when something is already selected]] } -interface Efl.Ui.Text.Interactive () +interface Efl.Ui.Text.Interactive (Efl.Text, Efl.Text.Font, + Efl.Text.Format, Efl.Text.Style) { [[This is an interface interactive text inputs should implement]] methods { @@ -37,14 +38,6 @@ interface Efl.Ui.Text.Interactive () end: Efl.Canvas.Text.Cursor; [[The end of the selection]] } } - @property multiline { - [[Whether or not this textblock is allowed to be multiline]] - set {} - get {} - values { - enabled: bool; [[$true if enabled, $false otherwise]] - } - } @property editable { [[Whether the entry is editable.