diff --git a/src/bin/elementary/test_entry.c b/src/bin/elementary/test_entry.c index b94c525c12..9086ca7aee 100644 --- a/src/bin/elementary/test_entry.c +++ b/src/bin/elementary/test_entry.c @@ -2960,13 +2960,15 @@ test_efl_ui_text(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve en = eo_add(EFL_UI_TEXT_CLASS, win); printf("Added Efl.Ui.Text object\n"); -// elm_entry_line_wrap_set(en, ELM_WRAP_NONE); - efl_text_set(en, "Hello world!\nGoodbye world!\n" - "Another line\nAnd another line\nYet another line!"); - efl_ui_text_interactive_editable_set(en, EINA_TRUE); + efl_text_set(en, "Hello world! Goodbye world! This is a test text for the" + " new UI Text widget.\xE2\x80\xA9This is the next paragraph.\nThis" + " is the next line.\nThis is Yet another line! Line and paragraph" + " separators are actually different!"); cur = efl_ui_text_cursor_new(en); efl_canvas_text_cursor_position_set(cur, 2); efl_canvas_text_cursor_object_item_insert(cur, "size=32x32 href=emoticon"); + efl_ui_text_interactive_editable_set(en, EINA_TRUE); + efl_ui_text_scrollable_set(en, EINA_TRUE); evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, en); diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c index 8a14f337e7..05f13842df 100644 --- a/src/lib/elementary/efl_ui_text.c +++ b/src/lib/elementary/efl_ui_text.c @@ -266,6 +266,7 @@ static void _efl_ui_text_anchor_hover_end(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data static void _efl_ui_text_anchor_hover_parent_set(Eo *obj, Efl_Ui_Text_Data *sd, Evas_Object *parent); static const char* _efl_ui_text_selection_get(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd); static void _edje_signal_emit(Efl_Ui_Text_Data *obj, const char *sig, const char *src); +static void _decoration_defer_all(Eo *obj); static Mod_Api * _module_find(Evas_Object *obj EINA_UNUSED) @@ -1096,242 +1097,54 @@ _cursor_geometry_recalc(Evas_Object *obj) eo_event_callback_call(obj, EFL_UI_TEXT_EVENT_CURSOR_CHANGED, NULL); - if (!sd->deferred_recalc_job) - { - Evas_Coord cx, cy, cw, ch; + Evas_Coord x, y, w, h; + Evas_Coord x2, y2, w2, h2; + Evas_Coord cx, cy, cw, ch; - edje_object_part_text_cursor_geometry_get - (sd->entry_edje, "elm.text", &cx, &cy, &cw, &ch); - if (sd->cur_changed) - { - sd->cur_changed = EINA_FALSE; - elm_widget_show_region_set(obj, cx, cy, cw, ch, EINA_FALSE); - } - } - else - sd->deferred_cur = EINA_TRUE; -} + Efl_Canvas_Text_Cursor *main_cur = + efl_canvas_text_cursor_get(obj); -static void -_deferred_recalc_job(void *data) -{ - Evas_Coord minh = -1, resw = -1, resh = -1, minw = -1, fw = 0, fh = 0; - Eo *sw; - - EFL_UI_TEXT_DATA_GET(data, sd); - - sd->deferred_recalc_job = NULL; - - sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); - evas_object_geometry_get(sd->entry_edje, NULL, NULL, &resw, &resh); - //FIXME: will not work with complex themes. - evas_object_resize(sw, resw, resh); - efl_canvas_text_size_formatted_get(sw, &minw, &minh); - evas_object_size_hint_min_set(sw, minw, minh); - edje_object_size_min_restricted_calc(sd->entry_edje, &minw, &minh, resw, 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 <= resw) - { - Evas_Coord ominw = -1; - - evas_object_size_hint_min_get(data, &ominw, NULL); - minw = ominw; - } - - sd->ent_mw = minw; - sd->ent_mh = minh; - - elm_coords_finger_size_adjust(1, &fw, 1, &fh); - if (sd->scroll) - { - Evas_Coord vmw = 0, vmh = 0; - - edje_object_size_min_calc(sd->scr_edje, &vmw, &vmh); - if (sd->single_line) - { - evas_object_size_hint_min_set(data, vmw, minh + vmh); - evas_object_size_hint_max_set(data, -1, minh + vmh); - } - else - { - evas_object_size_hint_min_set(data, vmw, vmh); - evas_object_size_hint_max_set(data, -1, -1); - } - } - else - { - if (sd->single_line) - { - evas_object_size_hint_min_set(data, minw, minh); - evas_object_size_hint_max_set(data, -1, minh); - } - else - { - evas_object_size_hint_min_set(data, fw, minh); - evas_object_size_hint_max_set(data, -1, -1); - } - } - - if (sd->deferred_cur) - { - Evas_Coord cx, cy, cw, ch; - - edje_object_part_text_cursor_geometry_get - (sd->entry_edje, "elm.text", &cx, &cy, &cw, &ch); - if (sd->cur_changed) - { - sd->cur_changed = EINA_FALSE; - elm_widget_show_region_set(data, cx, cy, cw, ch, EINA_FALSE); - } - } - _update_decorations(data); -} - -static inline void -_recalc_defer(Eo *obj) -{ - EFL_UI_TEXT_DATA_GET(obj, sd); - ecore_job_del(sd->deferred_recalc_job); - sd->deferred_recalc_job = - ecore_job_add(_deferred_recalc_job, obj); + efl_canvas_text_cursor_geometry_get(main_cur, + EFL_CANVAS_TEXT_CURSOR_TYPE_BEFORE, + &cx, &cy, &cw, &ch, NULL, NULL, NULL, NULL); + edje_object_size_min_restricted_calc(sd->cursor, &cw, NULL, cw, 0); + if (cw < 1) cw = 1; + if (ch < 1) ch = 1; + edje_object_size_min_restricted_calc(sd->cursor, &cw, NULL, cw, 0); + evas_object_geometry_get(sd->entry_edje, &x, &y, &w, &h); + evas_object_geometry_get( + edje_object_part_swallow_get(sd->entry_edje, "elm.text"), + &x2, &y2, &w2, &h2); + cx = cx + x - x2; + cy = cy + y - y2; + elm_widget_show_region_set(obj, cx, cy, cw, ch, EINA_FALSE); } EOLIAN static void _efl_ui_text_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Text_Data *sd) { - Evas_Coord minw = -1, minh = -1; - Evas_Coord resw, resh; + Evas_Coord vw = 0, vh = 0; + Evas_Coord minw, minh; + Eo *sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); - evas_object_geometry_get(obj, NULL, NULL, &resw, &resh); - - if (sd->line_wrap) + evas_event_freeze(evas_object_evas_get(obj)); + /* Only implement single-line */ + if (sd->scr_edje) { - if ((resw == sd->last_w) && (!sd->changed)) - { - if (sd->scroll) - { - Evas_Coord vw = 0, vh = 0, w = 0, h = 0; + elm_interface_scrollable_content_viewport_geometry_get + (obj, NULL, NULL, &vw, &vh); + //evas_object_geometry_get(sd->scr_edje, NULL, NULL, &resw, &resh); + //evas_object_resize(sd->entry_edje, resw, resh); + evas_object_resize(sw, vw, vh); + efl_canvas_text_size_formatted_get(sw, &minw, &minh); + evas_object_size_hint_min_set(sw, minw, vh); + edje_object_size_min_restricted_calc(sd->entry_edje, &minw, &minh, vw, 0); - elm_interface_scrollable_content_viewport_geometry_get - (obj, NULL, NULL, &vw, &vh); - - w = sd->ent_mw; - h = sd->ent_mh; - if (vw > sd->ent_mw) w = vw; - if (vh > sd->ent_mh) h = vh; - evas_object_resize(sd->entry_edje, w, h); - - return; - } - - 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_object_resize(sd->scr_edje, resw, resh); - 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) - { - Evas_Coord ominw = -1; - - evas_object_size_hint_min_get(sd->entry_edje, &ominw, NULL); - minw = ominw; - } - 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 - { - _recalc_defer(obj); - } - - evas_event_thaw(evas_object_evas_get(obj)); - evas_event_thaw_eval(evas_object_evas_get(obj)); + evas_object_resize(sd->entry_edje, minw, minh); } - else - { - if (!sd->changed) 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; - - edje_object_size_min_calc(sd->entry_edje, &minw, &minh); - sd->ent_mw = minw; - sd->ent_mh = minh; - elm_coords_finger_size_adjust(1, &minw, 1, &minh); - - elm_interface_scrollable_content_viewport_geometry_get - (obj, NULL, NULL, &vw, &vh); - - if (minw > vw) vw = minw; - if (minh > vh) vh = minh; - - evas_object_resize(sd->entry_edje, vw, vh); - edje_object_size_min_calc(sd->scr_edje, &vmw, &vmh); - if (sd->single_line) h = vmh + minh; - else h = vmh; - - 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 - { - edje_object_size_min_calc(sd->entry_edje, &minw, &minh); - sd->ent_mw = minw; - sd->ent_mh = minh; - elm_coords_finger_size_adjust(1, &minw, 1, &minh); - evas_object_size_hint_min_set(obj, minw, minh); - - if (sd->single_line) - evas_object_size_hint_max_set(obj, -1, minh); - else - evas_object_size_hint_max_set(obj, -1, -1); - } - evas_event_thaw(evas_object_evas_get(obj)); - evas_event_thaw_eval(evas_object_evas_get(obj)); - } - _cursor_geometry_recalc(obj); + evas_event_thaw(evas_object_evas_get(obj)); + evas_event_thaw_eval(evas_object_evas_get(obj)); } static void @@ -1363,13 +1176,9 @@ _efl_ui_text_elm_widget_on_focus(Eo *obj, Efl_Ui_Text_Data *sd, Elm_Object_Item if (elm_widget_focus_get(obj)) { -#if 0 - evas_object_focus_set(sd->entry_edje, EINA_TRUE); -#else Eo *sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); evas_object_focus_set(sw, EINA_TRUE); -#endif _edje_signal_emit(sd, "elm,action,focus", "elm"); if (sd->scroll) edje_object_signal_emit(sd->scr_edje, "elm,action,focus", "elm"); @@ -1385,15 +1194,13 @@ _efl_ui_text_elm_widget_on_focus(Eo *obj, Efl_Ui_Text_Data *sd, Elm_Object_Item } else { + Eo *sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); + _edje_signal_emit(sd, "elm,action,unfocus", "elm"); if (sd->scroll) edje_object_signal_emit(sd->scr_edje, "elm,action,unfocus", "elm"); -#if 0 - evas_object_focus_set(sd->entry_edje, EINA_FALSE); -#else - Eo *sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); evas_object_focus_set(sw, EINA_FALSE); -#endif + if (top && top_is_win && sd->input_panel_enable && !edje_object_part_text_imf_context_get(sd->entry_edje, "elm.text")) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF); @@ -1447,9 +1254,7 @@ _show_region_hook(void *data EINA_UNUSED, Evas_Object *obj) { Evas_Coord x, y, w, h; - elm_widget_show_region_get(obj, &x, &y, &w, &h); - elm_interface_scrollable_content_region_show(obj, x, y, w, h); } @@ -3566,7 +3371,12 @@ _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv) text_obj = eo_add(EFL_UI_INTERNAL_TEXT_INTERACTIVE_CLASS, obj); eo_composite_attach(obj, text_obj); + edje_object_part_swallow(priv->entry_edje, "elm.text", text_obj); + evas_object_size_hint_weight_set + (priv->entry_edje, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set + (priv->entry_edje, EVAS_HINT_FILL, EVAS_HINT_FILL); efl_canvas_text_style_set(text_obj, NULL, "DEFAULT='font=Sans font_size=14 color=#fff wrap=word'"); eo_event_callback_add(text_obj, EFL_UI_TEXT_INTERACTIVE_EVENT_CHANGED_USER, _efl_ui_text_changed_cb, obj); @@ -5772,7 +5582,9 @@ static void _efl_ui_text_cursor_changed_cb(void *data, const Eo_Event *event EINA_UNUSED) { EFL_UI_TEXT_DATA_GET(data, sd); + sd->cur_changed = EINA_TRUE; sd->deferred_decoration_cursor = EINA_TRUE; + _cursor_geometry_recalc(data); _decoration_defer(data); }