diff options
author | Tom Hacohen <tom@stosb.com> | 2016-06-09 13:51:42 +0100 |
---|---|---|
committer | Tom Hacohen <tom@stosb.com> | 2016-06-09 14:09:34 +0100 |
commit | 351c2b9d6eacdf6377dfa97869809de09bd3efee (patch) | |
tree | dd897b5829ac04d89e5e3eb55ff502a6ad60f1a1 | |
parent | bf62b2acf47c39d988f3a90700888007f17b5051 (diff) | |
download | efl-351c2b9d6eacdf6377dfa97869809de09bd3efee.tar.gz |
Text interactive: Fix user text change reporting.
This is useful for implementing undo/redo.
-rw-r--r-- | src/lib/elementary/efl_ui_internal_text_interactive.c | 74 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_internal_text_interactive.eo | 15 |
2 files changed, 55 insertions, 34 deletions
diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c index d789f59726..6ec91b6d5f 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.c +++ b/src/lib/elementary/efl_ui_internal_text_interactive.c @@ -631,58 +631,53 @@ _range_del_emit(Evas_Textblock_Cursor *cur, Evas_Object *obj, Efl_Ui_Internal_Te { size_t start, end; char *tmp; - Edje_Entry_Change_Info *info; + Efl_Ui_Internal_Text_Interactive_Change_Info info = {0}; start = evas_textblock_cursor_pos_get(en->sel_start); end = evas_textblock_cursor_pos_get(en->sel_end); if (start == end) goto noop; - info = calloc(1, sizeof(*info)); - info->insert = EINA_FALSE; - info->change.del.start = start; - info->change.del.end = end; + info.insert = EINA_FALSE; + info.position = start; + info.length = end - start; + + tmp = efl_canvas_text_range_text_get(obj, en->sel_start, en->sel_end); + info.content = tmp; + + eo_event_callback_call(obj, EFL_UI_INTERNAL_TEXT_INTERACTIVE_EVENT_CHANGED_USER, &info); - tmp = evas_textblock_cursor_range_text_get(en->sel_start, en->sel_end, EVAS_TEXTBLOCK_TEXT_MARKUP); - info->change.del.content = eina_stringshare_add(tmp); if (tmp) free(tmp); + evas_textblock_cursor_range_delete(en->sel_start, en->sel_end); noop: _sel_clear(cur, obj, en); } static void -_delete_emit(Evas_Textblock_Cursor *c, Efl_Ui_Internal_Text_Interactive_Data *en EINA_UNUSED, size_t pos, - Eina_Bool backspace) +_delete_emit(Evas_Textblock_Cursor *c, Efl_Ui_Internal_Text_Interactive_Data *en EINA_UNUSED, size_t pos) { - if (!evas_textblock_cursor_char_next(c)) - { - return; - } - evas_textblock_cursor_char_prev(c); - - Edje_Entry_Change_Info *info = calloc(1, sizeof(*info)); - char *tmp = evas_textblock_cursor_content_get(c); - - info->insert = EINA_FALSE; - if (backspace) - { - info->change.del.start = pos - 1; - info->change.del.end = pos; - } - else - { - info->change.del.start = pos + 1; - info->change.del.end = pos; - } - - info->change.del.content = eina_stringshare_add(tmp); + Efl_Ui_Internal_Text_Interactive_Change_Info info = {0}; + Eina_Unicode content[2]; + content[0] = efl_canvas_text_cursor_content_get(c); + content[1] = 0; + if (!content[0]) + return; + + char *tmp = eina_unicode_unicode_to_utf8(content, NULL); + + info.insert = EINA_FALSE; + info.position = pos; + info.length = 1; + info.content = tmp; + + eo_event_callback_call((Eo *) efl_canvas_text_cursor_text_object_get(c), + EFL_UI_INTERNAL_TEXT_INTERACTIVE_EVENT_CHANGED_USER, &info); if (tmp) free(tmp); evas_textblock_cursor_char_delete(c); } - static Eina_Bool _is_modifier(const char *key) { @@ -881,7 +876,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void { if (evas_textblock_cursor_char_prev(cur)) { - _delete_emit(cur, en, old_cur_pos, EINA_TRUE); + _delete_emit(cur, en, old_cur_pos - 1); } } } @@ -917,7 +912,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void } else { - _delete_emit(cur, en, old_cur_pos, EINA_FALSE); + _delete_emit(cur, en, old_cur_pos); } } _sel_clear(cur, obj, en); @@ -1050,12 +1045,23 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void } if (string) { + Efl_Ui_Internal_Text_Interactive_Change_Info info = {0}; if (en->have_selection) { _range_del_emit(cur, obj, en); + info.merge = EINA_TRUE; } + info.insert = EINA_TRUE; + info.content = string; + info.position = efl_canvas_text_cursor_position_get(cur); + info.length = eina_unicode_utf8_get_len(string); + + eo_event_callback_call(obj, + EFL_UI_INTERNAL_TEXT_INTERACTIVE_EVENT_CHANGED_USER, &info); + efl_canvas_text_cursor_text_insert(cur, string); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + if (free_string) free(string); } } diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.eo b/src/lib/elementary/efl_ui_internal_text_interactive.eo index 3a4dec0c9f..afe595d12b 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.eo +++ b/src/lib/elementary/efl_ui_internal_text_interactive.eo @@ -1,3 +1,15 @@ +struct Efl.Ui.Internal.Text.Interactive.Change_Info { + [[This structure includes all the information about content changes. + + It's meant to be used to implement undo/redo. + ]] + content: string; [[The content added/removed]] + position: size; [[The position where it was added/removed]] + length: size; [[The length of content in characters (not bytes, actual unicode characters)]] + insert: bool; [[$true if the content was inserted, $false if removei]] + merge: bool; [[$true if can be merged with the previous one. Used for example with insertion when something is already selected]] +} + class Efl.Ui.Internal.Text.Interactive (Efl.Canvas.Text) { [[An internal object that is in charge of the interactive aspect of the text widget @@ -26,4 +38,7 @@ class Efl.Ui.Internal.Text.Interactive (Efl.Canvas.Text) Eo.Base.constructor; Eo.Base.finalize; } + events { + changed,user; + } } |