summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Hacohen <tom@stosb.com>2016-06-09 13:51:42 +0100
committerTom Hacohen <tom@stosb.com>2016-06-09 14:09:34 +0100
commit351c2b9d6eacdf6377dfa97869809de09bd3efee (patch)
treedd897b5829ac04d89e5e3eb55ff502a6ad60f1a1
parentbf62b2acf47c39d988f3a90700888007f17b5051 (diff)
downloadefl-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.c74
-rw-r--r--src/lib/elementary/efl_ui_internal_text_interactive.eo15
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;
+ }
}