diff options
Diffstat (limited to 'src/lib/elementary/efl_ui_text.c')
-rw-r--r-- | src/lib/elementary/efl_ui_text.c | 182 |
1 files changed, 135 insertions, 47 deletions
diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c index fccb5c877c..4bb2ad5a56 100644 --- a/src/lib/elementary/efl_ui_text.c +++ b/src/lib/elementary/efl_ui_text.c @@ -92,6 +92,11 @@ struct _Efl_Ui_Text_Data Elm_Cnp_Mode cnp_mode; Elm_Sel_Format drop_format; + struct { + char *text; + Eina_Bool enabled; + } async; + Eina_Bool input_panel_return_key_disabled : 1; Eina_Bool drag_selection_asked : 1; Eina_Bool sel_handler_disabled : 1; @@ -127,7 +132,6 @@ struct _Efl_Ui_Text_Data Eina_Bool scroll : 1; Eina_Bool input_panel_show_on_demand : 1; Eina_Bool anchors_updated : 1; - Eina_Bool test_bit : 1; }; struct _Anchor @@ -916,7 +920,7 @@ _efl_ui_text_elm_widget_theme_apply(Eo *obj, Efl_Ui_Text_Data *sd) theme_apply = elm_obj_widget_theme_apply(efl_cast(obj, ELM_WIDGET_CLASS)); if (!theme_apply) return EFL_UI_THEME_APPLY_FAILED; - evas_event_freeze(evas_object_evas_get(obj)); + efl_event_freeze(obj); edje_object_mirrored_set (wd->resize_obj, efl_ui_mirrored_get(obj)); @@ -1017,12 +1021,10 @@ _efl_ui_text_elm_widget_theme_apply(Eo *obj, Efl_Ui_Text_Data *sd) } sd->changed = EINA_TRUE; - elm_layout_sizing_eval(obj); sd->has_text = !sd->has_text; _efl_ui_text_guide_update(obj, !sd->has_text); - evas_event_thaw(evas_object_evas_get(obj)); - evas_event_thaw_eval(evas_object_evas_get(obj)); + efl_event_thaw(obj); efl_event_callback_legacy_call(obj, EFL_UI_LAYOUT_EVENT_THEME_CHANGED, NULL); @@ -1067,38 +1069,23 @@ _cursor_geometry_recalc(Evas_Object *obj) elm_widget_show_region_set(obj, sr, EINA_FALSE); } -EOLIAN static void -_efl_ui_text_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Text_Data *sd) +static void +_layout_text_sizing_eval(Eo *obj, Evas_Coord tw, Evas_Coord th) { - Evas_Coord minw, minh, resw, resh; - Evas_Coord fw, fh; Eo *sw; - Eina_Bool wrap; - - evas_object_geometry_get(obj, NULL, NULL, &resw, &resh); - - sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); - if (!sw) return; - - wrap = efl_text_wrap_get(sw); + Evas_Coord minw, minh; - if (!sd->changed && (resw == sd->ent_w) && (resh == sd->ent_h)) return; - - sd->changed = EINA_FALSE; - sd->ent_w = resw; - sd->ent_h = resh; + efl_event_freeze(obj); + EFL_UI_TEXT_DATA_GET(obj, sd); - evas_event_freeze(evas_object_evas_get(obj)); + sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); if (sd->scroll) { - Evas_Coord vw, vh; - Evas_Coord tw, th; + Evas_Coord vw = 0, vh = 0; + 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); + evas_object_size_hint_min_set(sw, tw, th); edje_object_size_min_calc(sd->entry_edje, &minw, &minh); evas_object_size_hint_min_set(sw, -1, -1); @@ -1112,8 +1099,10 @@ _efl_ui_text_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Text_Data *sd) } else { - efl_canvas_text_size_formatted_get(sw, &fw, &fh); - evas_object_size_hint_min_set(sw, fw, fh); + Eina_Bool wrap; + + wrap = efl_text_wrap_get(sw); + evas_object_size_hint_min_set(sw, tw, th); 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) @@ -1121,13 +1110,56 @@ _efl_ui_text_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Text_Data *sd) evas_object_size_hint_min_set(obj, minw, minh); } } - evas_event_thaw(evas_object_evas_get(obj)); - evas_event_thaw_eval(evas_object_evas_get(obj)); + efl_event_thaw(obj); + _decoration_defer_all(obj); +} - if (!sd->deferred_decoration_cursor) +EOLIAN static void +_efl_ui_text_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Text_Data *sd) +{ + Evas_Coord resw, resh; + Eo *sw; + Eina_Bool can_async; + + evas_object_geometry_get(obj, NULL, NULL, &resw, &resh); + + sw = edje_object_part_swallow_get(sd->entry_edje, "elm.text"); + if (!sw) return; + + if (!sd->changed && (resw == sd->ent_w) && (resh == sd->ent_h)) return; + + sd->changed = EINA_FALSE; + sd->ent_w = resw; + sd->ent_h = resh; + + + can_async = !sd->editable && sd->async.enabled; + + efl_event_freeze(obj); + if (sd->scroll) { - sd->deferred_decoration_cursor = EINA_TRUE; - _decoration_defer(obj); + Evas_Coord vw = 0, vh = 0; + elm_interface_scrollable_content_viewport_geometry_get(obj, NULL, NULL, &vw, &vh); + efl_gfx_size_set(sd->entry_edje, vw, vh); + } + if (can_async) + { + efl_event_thaw(obj); + efl_canvas_text_async_layout(sw); + } + else + { + /* Don't defer - complete the sizing evaluation now */ + Evas_Coord fw, fh; + efl_canvas_text_size_formatted_get(obj, &fw, &fh); + efl_event_thaw(obj); + _layout_text_sizing_eval(obj, fw, fh); + + if (!sd->deferred_decoration_cursor) + { + sd->deferred_decoration_cursor = EINA_TRUE; + _decoration_defer(obj); + } } } @@ -2088,7 +2120,7 @@ _entry_changed_handle(void *data, single_line = !efl_text_multiline_get(obj); - evas_event_freeze(evas_object_evas_get(data)); + efl_event_freeze(obj); sd->changed = EINA_TRUE; /* Reset the size hints which are no more relevant. Keep the * height, this is a hack, but doesn't really matter cause we'll @@ -2105,8 +2137,7 @@ _entry_changed_handle(void *data, elm_layout_sizing_eval(data); ELM_SAFE_FREE(sd->text, eina_stringshare_del); ELM_SAFE_FREE(sd->delay_write, ecore_timer_del); - evas_event_thaw(evas_object_evas_get(data)); - evas_event_thaw_eval(evas_object_evas_get(data)); + efl_event_thaw(obj); if ((sd->auto_save) && (sd->file)) sd->delay_write = ecore_timer_add(EFL_UI_TEXT_DELAY_WRITE_TIME, _delay_write, data); @@ -2952,6 +2983,21 @@ _end_handler_mouse_move_cb(void *data, _magnifier_move(data); } +static void +_on_layout_complete(void *data, const Efl_Event *event) +{ + EFL_UI_TEXT_DATA_GET(data, sd); + Efl_Canvas_Text_Async_Layout_Event_Info *ev = event->info; + _layout_text_sizing_eval(data, ev->w, ev->h); + + if (sd->async.text) + { + efl_text_set(sd->text_obj, sd->async.text); + free(sd->async.text); + sd->async.text = NULL; + } +} + EOLIAN static void _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv) { @@ -2962,8 +3008,18 @@ _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv) /* XXX: needs to be before efl_canvas_group_add, since the latter will * trigger a layout_sizing_eval call and requires the canvas text object to * be instantiated. */ - text_obj = efl_add(EFL_UI_INTERNAL_TEXT_INTERACTIVE_CLASS, obj); + if (priv->async.enabled) + { + text_obj = efl_add(EFL_UI_INTERNAL_TEXT_INTERACTIVE_CLASS, obj, + efl_canvas_text_async_set(efl_added, EINA_TRUE)); + } + else + { + text_obj = efl_add(EFL_UI_INTERNAL_TEXT_INTERACTIVE_CLASS, obj); + } + efl_composite_attach(obj, text_obj); + priv->text_obj = text_obj; // FIXME: use the theme, when a proper theming option is available // (possibly, text_classes). @@ -2974,7 +3030,6 @@ _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv) efl_canvas_group_add(efl_super(obj, MY_CLASS)); elm_widget_sub_object_parent_add(obj); - priv->test_bit = EINA_TRUE; priv->entry_edje = wd->resize_obj; priv->cnp_mode = ELM_CNP_MODE_PLAINTEXT; @@ -3012,6 +3067,13 @@ _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv) evas_object_event_callback_add(priv->entry_edje, EVAS_CALLBACK_MOVE, _efl_ui_text_move_cb, obj); + /* Async layout */ + if (priv->async.enabled) + { + efl_event_callback_add(text_obj, + EFL_CANVAS_TEXT_EVENT_ASYNC_LAYOUT_COMPLETE, + _on_layout_complete, obj); + } priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj)); evas_object_data_set(priv->hit_rect, "_elm_leaveme", obj); @@ -3106,7 +3168,7 @@ _efl_ui_text_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Text_Data *priv) edje_object_part_text_select_allow_set (priv->entry_edje, "elm.text", EINA_TRUE); - elm_layout_sizing_eval(obj); + //elm_layout_sizing_eval(obj); efl_ui_text_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL); efl_ui_text_input_panel_enabled_set(obj, EINA_TRUE); @@ -3189,7 +3251,7 @@ _efl_ui_text_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Text_Data *sd) _efl_ui_text_anchor_hover_end(obj, sd); _efl_ui_text_anchor_hover_parent_set(obj, sd, NULL); - evas_event_freeze(evas_object_evas_get(obj)); + efl_event_freeze(obj); eina_stringshare_del(sd->file); @@ -3232,8 +3294,7 @@ _efl_ui_text_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Text_Data *sd) free(sd->input_panel_imdata); eina_stringshare_del(sd->anchor_hover.hover_style); - evas_event_thaw(evas_object_evas_get(obj)); - evas_event_thaw_eval(evas_object_evas_get(obj)); + efl_event_thaw(obj); if (sd->start_handler) { @@ -3333,7 +3394,7 @@ _cb_deleted(void *data EINA_UNUSED, const Efl_Event *ev) } EOLIAN static Eo * -_efl_ui_text_efl_object_constructor(Eo *obj, Efl_Ui_Text_Data *_pd EINA_UNUSED) +_efl_ui_text_efl_object_constructor(Eo *obj, Efl_Ui_Text_Data *pd EINA_UNUSED) { obj = efl_constructor(efl_super(obj, MY_CLASS)); efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY); @@ -5358,13 +5419,40 @@ ELM_LAYOUT_CONTENT_ALIASES_IMPLEMENT(MY_CLASS_PFX) #define EFL_UI_TEXT_EXTRA_OPS \ EFL_CANVAS_GROUP_ADD_DEL_OPS(efl_ui_text), \ ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_text), \ - ELM_LAYOUT_CONTENT_ALIASES_OPS(MY_CLASS_PFX) + ELM_LAYOUT_CONTENT_ALIASES_OPS(MY_CLASS_PFX), \ #include "efl_ui_text.eo.c" +EOLIAN static Eo * +_efl_ui_text_async_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED) +{ + obj = efl_constructor(efl_super(obj, EFL_UI_TEXT_ASYNC_CLASS)); + return obj; +} + +EOLIAN static void +_efl_ui_text_async_efl_canvas_group_group_add(Eo *obj, void *_pd EINA_UNUSED) +{ + EFL_UI_TEXT_DATA_GET(obj, sd); + sd->async.enabled = EINA_TRUE; + efl_canvas_group_add(efl_super(obj, EFL_UI_TEXT_ASYNC_CLASS)); +} + +EOLIAN static void +_efl_ui_text_async_efl_canvas_group_group_del(Eo *obj, void *_pd EINA_UNUSED) +{ + efl_canvas_group_del(efl_super(obj, EFL_UI_TEXT_ASYNC_CLASS)); +} + +#define EFL_UI_TEXT_ASYNC_EXTRA_OPS \ + EFL_CANVAS_GROUP_ADD_DEL_OPS(efl_ui_text_async) + +#include "efl_ui_text_async.eo.c" + #undef MY_CLASS #define MY_CLASS EFL_UI_TEXT_EDITABLE_CLASS + EOLIAN static Eo * _efl_ui_text_editable_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED) { |