ajwillia-ms pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=6c0d51322b6ae3fd006153c5384dc754e3d709d6
commit 6c0d51322b6ae3fd006153c5384dc754e3d709d6 Author: Andy Williams <[email protected]> Date: Tue Jun 14 22:47:22 2016 +0100 elementary: Fix repeated undo of character deletion Let's not trigger further undo stack changes when we undo changes. --- src/lib/elementary/elm_code_widget.c | 23 +++++-- src/lib/elementary/elm_code_widget_private.h | 1 + src/lib/elementary/elm_code_widget_undo.c | 2 +- src/tests/elementary/elm_code_test_widget_undo.c | 78 ++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 5 deletions(-) diff --git a/src/lib/elementary/elm_code_widget.c b/src/lib/elementary/elm_code_widget.c index 34e6279..dd72f6d 100644 --- a/src/lib/elementary/elm_code_widget.c +++ b/src/lib/elementary/elm_code_widget.c @@ -1043,7 +1043,7 @@ _elm_code_widget_change_free(Elm_Code_Widget_Change_Info *info) } void -_elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const char *text, int length) +_elm_code_widget_text_at_cursor_insert_do(Elm_Code_Widget *widget, const char *text, int length, Eina_Bool undo) { Elm_Code *code; Elm_Code_Line *line; @@ -1071,9 +1071,24 @@ _elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const char *text elm_obj_code_widget_cursor_position_set(widget, col + col_width, row); eo_event_callback_call(widget, ELM_OBJ_CODE_WIDGET_EVENT_CHANGED_USER, NULL); - change = _elm_code_widget_change_create(col, row, col + col_width - 1, row, text, length, EINA_TRUE); - _elm_code_widget_undo_change_add(widget, change); - _elm_code_widget_change_free(change); + if (undo) + { + change = _elm_code_widget_change_create(col, row, col + col_width - 1, row, text, length, EINA_TRUE); + _elm_code_widget_undo_change_add(widget, change); + _elm_code_widget_change_free(change); + } +} + +void +_elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const char *text, int length) +{ + _elm_code_widget_text_at_cursor_insert_do(widget, text, length, EINA_TRUE); +} + +void +_elm_code_widget_text_at_cursor_insert_no_undo(Elm_Code_Widget *widget, const char *text, int length) +{ + _elm_code_widget_text_at_cursor_insert_do(widget, text, length, EINA_FALSE); } static void diff --git a/src/lib/elementary/elm_code_widget_private.h b/src/lib/elementary/elm_code_widget_private.h index 09c5003..c3c5bb0 100644 --- a/src/lib/elementary/elm_code_widget_private.h +++ b/src/lib/elementary/elm_code_widget_private.h @@ -48,6 +48,7 @@ typedef struct void _elm_code_widget_cell_size_get(Elm_Code_Widget *widget, Evas_Coord *width, Evas_Coord *height); void _elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const char *text, int length); +void _elm_code_widget_text_at_cursor_insert_no_undo(Elm_Code_Widget *widget, const char *text, int length); void _elm_code_widget_newline(Elm_Code_Widget *widget); diff --git a/src/lib/elementary/elm_code_widget_undo.c b/src/lib/elementary/elm_code_widget_undo.c index ccf621b..7c9113f 100644 --- a/src/lib/elementary/elm_code_widget_undo.c +++ b/src/lib/elementary/elm_code_widget_undo.c @@ -46,7 +46,7 @@ _elm_code_widget_undo_change(Evas_Object *widget, else { elm_code_widget_cursor_position_set(widget, info->start_col, info->start_line); - _elm_code_widget_text_at_cursor_insert(widget, info->content, info->length); + _elm_code_widget_text_at_cursor_insert_no_undo(widget, info->content, info->length); } } diff --git a/src/tests/elementary/elm_code_test_widget_undo.c b/src/tests/elementary/elm_code_test_widget_undo.c index b07a294..ddfc7b0 100644 --- a/src/tests/elementary/elm_code_test_widget_undo.c +++ b/src/tests/elementary/elm_code_test_widget_undo.c @@ -58,6 +58,43 @@ START_TEST (elm_code_test_widget_undo_text_insert) } END_TEST +START_TEST (elm_code_test_widget_undo_text_insert_multiple) +{ + Elm_Code *code; + Elm_Code_File *file; + Elm_Code_Line *line; + Elm_Code_Widget *widget; + Evas_Object *win; + unsigned int length; + const char *content; + + elm_init(1, NULL); + code = elm_code_create(); + file = elm_code_file_new(code); + elm_code_file_line_append(file, "test", 4, NULL); + + win = elm_win_add(NULL, "entry", ELM_WIN_BASIC); + widget = elm_code_widget_add(win, code); + + _elm_code_widget_text_at_cursor_insert(widget, "a", 1); + _elm_code_widget_text_at_cursor_insert(widget, "b", 1); + line = elm_code_file_line_get(file, 1); + content = elm_code_line_text_get(line, &length); + ck_assert_strn_eq("abtest", content, length); + + elm_code_widget_undo(widget); + content = elm_code_line_text_get(line, &length); + ck_assert_strn_eq("atest", content, length); + + elm_code_widget_undo(widget); + content = elm_code_line_text_get(line, &length); + ck_assert_strn_eq("test", content, length); + + elm_code_free(code); + elm_shutdown(); +} +END_TEST + START_TEST (elm_code_test_widget_undo_newline) { Elm_Code *code; @@ -157,9 +194,50 @@ START_TEST (elm_code_test_widget_undo_delete) } END_TEST +START_TEST (elm_code_test_widget_undo_delete_multiple) +{ + Elm_Code *code; + Elm_Code_File *file; + Elm_Code_Line *line; + Elm_Code_Widget *widget; + Evas_Object *win; + unsigned int length; + const char *content; + + elm_init(1, NULL); + code = elm_code_create(); + file = elm_code_file_new(code); + elm_code_file_line_append(file, "test", 4, NULL); + + win = elm_win_add(NULL, "entry", ELM_WIN_BASIC); + widget = elm_code_widget_add(win, code); + + elm_code_widget_cursor_position_set(widget, 4, 1); + _elm_code_widget_backspace(widget); + _elm_code_widget_backspace(widget); + + line = elm_code_file_line_get(file, 1); + content = elm_code_line_text_get(line, &length); + ck_assert_strn_eq("tt", content, length); + + elm_code_widget_undo(widget); + content = elm_code_line_text_get(line, &length); + ck_assert_strn_eq("tet", content, length); + + elm_code_widget_undo(widget); + content = elm_code_line_text_get(line, &length); + ck_assert_strn_eq("test", content, length); + + elm_code_free(code); + elm_shutdown(); +} +END_TEST + void elm_code_test_widget_undo(TCase *tc) { tcase_add_test(tc, elm_code_test_widget_undo_text_insert); + tcase_add_test(tc, elm_code_test_widget_undo_text_insert_multiple); tcase_add_test(tc, elm_code_test_widget_undo_newline); tcase_add_test(tc, elm_code_test_widget_undo_delete); + tcase_add_test(tc, elm_code_test_widget_undo_delete_multiple); } --
